2016-09-29 1 views
-1

j'ai une trame de données telles que dataR Créer une variable avec les niveaux de données groupées

data = data.frame(ID = as.factor(c("A", "A", "B","B","C","C")), 
        var.color= as.factor(c("red", "blue", "green", "red", "green", "yellow"))) 

Je me demande s'il est possible d'obtenir les niveaux de chaque groupe dans ID (par exemple A, B, C) et créez une variable qui les colle. J'ai essayé de le faire en lançant ce qui suit:

data %>% group_by(ID) %>% 
    mutate(ex = paste(droplevels(var.color), sep = "_")) 

qui donne:

Source: local data frame [6 x 3] 
Groups: ID [3] 

     ID var.color  ex 
    <fctr> <fctr> <chr> 
1  A  red red 
2  A  blue blue 
3  B  green red 
4  B  red red 
5  C  green green 
6  C yellow yellow 

Cependant, mon choix data.frame devrait être quelque chose comme:

ID var.color  ex 
    <fctr> <fctr> <chr> 
1  A  red red_blue 
2  A  blue red_blue 
3  B  green green_red 
4  B  red green_red 
5  C  green green_yellow 
6  C yellow green_yellow 

Répondre

1

Fondamentalement, vous avez besoin collapse au lieu de sep

Au lieu de dro niveaux pping, vous pouvez simplement coller le texte ensemble regroupés par ID

library(dplyr) 
data %>% group_by(ID) %>% 
     mutate(ex = paste(var.color, collapse = "_")) 

#  ID  var.color  ex 
# <fctr> <fctr>  <chr> 
#1  A  red  red_blue 
#2  A  blue  red_blue 
#3  B  green  green_red 
#4  B  red  green_red 
#5  C  green  green_yellow 
#6  C yellow  green_yellow 
+1

Je l'ai édité. J'ai aussi utilisé «effondré» mais c'était à tort. Merci de clarifier. – Edu

1

Vous pouvez faire la même chose en utilisant des boucles

for(i in unique(data$ID)){ 
    data$ex[data$ID==i] <- paste0(data$var.color[data$ID==i], collapse = "_") 
} 

> data 
    ID var.color   ex 
1 A  red  red_blue 
2 A  blue  red_blue 
3 B  green green_red 
4 B  red green_red 
5 C  green green_yellow 
6 C yellow green_yellow