2015-07-23 12 views

Trả lời

5

Điều gì về điều này (giả sử dữ liệu của bạn là df)?

levels(df[,3])[table(df[,3])==1] <- "z" 
df 
    A B C 
1 a a a 
2 a b z 
3 a a z 
4 a b z 
5 a b a 
+2

Tùy chọn khác sẽ là 'cấp độ (x $ C) [cấp độ (x $ C)! = X $ C [trùng lặp (x $ C)]] =" z "' –

2

tôi chắc chắn rằng có một cách thanh lịch hơn để làm điều này nhưng đây là một giải pháp:

df <- read.table(text = "A B C 
         a a a 
         a b b 
         a a c 
         a b d 
         a b a", header = TRUE) 

# Get the number of times each factor occurs: 
counts <- table(df$C) 

# Replace each one that only occurs once with "z" 
df$C <- ifelse(df$C %in% names(counts[counts == 1]), "z", as.character(df$C)) 

# Since the levels changed, encode as a factor again: 
df$C <- factor(df$C) 

Điều này cho phép:

R> df$C 
[1] a z z z a 
Levels: a z 
1

sử dụng dplyr:

library(dplyr) 
df %>% group_by(C) %>% 
     mutate(D = as.character(ifelse(n() == 1, "z", as.character(C)))) 

Có một số công cụ xấu xí để đối phó với ifelse trong đó.

Các vấn đề liên quan