R转型折叠行

时间:2015-05-26 18:57:52

标签: r transform

我想取一个数据框并折叠列上的行,然后简单地创建另一个列,它是所有值的向量。

例如,我想像这样转换数据框:

id  item
1   100
1   103
1   109
1   101
2   102
2   109
2   107
2   105
3   105
3   106
3   101
3   102
3   110

要:

id  item
1   (100,103,109,101)
2   (102,109,107,105)
3   (105,106,101,102,110)

因此第一列是唯一ID,第二列是该ID所见的所有项目的向量/列表。这似乎应该很容易,但我还没有找到解决方案。如示例中所述,项目数量可能因身份而异。

这是创建我想要转换的初始数据框的代码。

id <- c(1,1,1,1,2,2,2,2,3,3,3,3,3)
item <- c(100,103,109,101,102,109,107,105,105,106,101,102,110)
input_frame <- data.frame(cbind(id,item))

4 个答案:

答案 0 :(得分:5)

您可以使用aggregate功能按 ID 进行分组,然后使用c功能从中收集相应的元素:

aggregate(formula = item ~ id, data = input_frame, FUN = c)

输出:

   id                    item
1  1      100, 103, 109, 101
2  2      102, 109, 107, 105
3  3 105, 106, 101, 102, 110

答案 1 :(得分:0)

library (plyr)
ddply(input_frame,.(id),summarize,val=paste(item,collapse=","))
  id                 val
1  1     100,103,109,101
2  2     102,109,107,105
3  3 105,106,101,102,110

答案 2 :(得分:0)

这是一个产生嵌套列表的解决方案:

item_list <- lapply(unique(id), function(i)
                   list(id=i,item=input_frame$item[id==i]) )

您可以通过

访问id==2的项目
item_list[[2]]$item

答案 3 :(得分:0)

library(dplyr)
summarise(group_by(input_frame,id),item=paste(item,collapse=','))