2017-09-13 1 views
1

J'ai les données:comment résumé les données historiques basées sur le même ID dans R

id |result 
-------- 
1 | a 
------- 
1 | b 
------- 
1 | c 
------- 
2 | e 
------- 
2 | f 
------- 
2 | g 

Le dataframe Je veux vraiment est ci-dessous:

id |result|history 
------------------- 
1 | a | 
------------------- 
1 | b | a 
------------------ 
1 | c | a,b 
------------------ 
2 | e | 
------------------ 
2 | f | e 
----------------- 
2 | g | e,f 

J'ai essayé d'utiliser retard dans R. Cependant, cela ne fonctionne pas bien pour celui-ci. Quelqu'un peut-il aider?

Répondre

0
df$History = unlist(tapply(X = df$result, INDEX = df$id, function(a) 
    c("", Reduce(function(x, y) {paste(x, y, sep = ", ")}, 
       head(a, -1), 
       accumulate = TRUE)))) 
df 
# id result History 
#1 1  a   
#2 1  b  a 
#3 1  c a, b 
#4 2  e   
#5 2  f  e 
#6 2  g e, f 

DONNÉES

df = structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L), result = c("a", 
     "b", "c", "e", "f", "g")), .Names = c("id", "result"), 
     class = "data.frame", row.names = c(NA, -6L)) 
+1

Cela a fonctionné parfaitement. Je vous remercie! – Lily

0

Voici une option à l'aide data.table

library(data.table) 
setDT(df1)[, history := Reduce(paste, shift(result, fill = ""), accumulate = TRUE), id] 
df1 
# id result history 
#1: 1  a   
#2: 1  b  a 
#3: 1  c  a b 
#4: 2  e   
#5: 2  f  e 
#6: 2  g  e f 

Si nous avons besoin , que la séparation

setDT(df1)[, history := c("", Reduce(function(...) paste(..., sep= ","), 
      result[-.N], accumulate = TRUE)), id] 
df1 
# id result history 
#1: 1  a   
#2: 1  b  a 
#3: 1  c  a,b 
#4: 2  e   
#5: 2  f  e 
#6: 2  g  e,f