2015-07-23 12 views
5

Supponiamo di avere un frame di dati con una colonna denominata C. C ha molti livelli che si verificano solo una volta. Come dovrei rinominare tutti i livelli che si verificano solo una volta con un nuovo livello (chiamato z)?Raggruppamento di bassi livelli di occorrenza in un frame di dati in R

A B C 
a a a 
a b b 
a a c 
a b d 
a b a 

È possibile che questo si trasformerebbe in:

A B C 
a a a 
a b z 
a a z 
a b z 
a b a 

risposta

5

Che dire di questo (supponendo che i dati siano 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

Un'altra opzione sarebbe 'livelli (x $ C) [livelli (x $ C)! = X $ C [duplicato (x $ C)]] =" z "' –

2

Sono sicuro che c'è un modo più elegante per fare questo, ma qui è una soluzione:

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) 

Questo dà:

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

utilizzando dplyr:

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

V'è un certo roba brutta per affrontare l'IfElse in là.

Problemi correlati