我在R中的以下数据帧:
objects categories
A 162
B 162
B 190
C 123
C 162
C 185
C 190
C 82
C 191
D 185
正如你看到有对象以及它们所属的类别。 我想总结一下每个对象的类别逗号分隔的列表以获得数据帧是这样的:
objects categories
A 162
B 162, 190
C 123, 162, 185, 190, 82, 191
D 185
我怎么能这样做?
这可以用任何你所选择的聚合工具来完成,我将展示使用一个例子plyr
包装和paste()
函数。 这是假设你的数据被命名为x
:
library(plyr)
ddply(x, .(objects), summarize, categories = paste(categories, collapse = ","))
#-----
objects categories
1 A 162
2 B 162,190
3 C 123,162,185,190,82,191
4 D 185
aggregate(categories~objects,data=x,FUN=paste)
objects categories
1 A 162
2 B 162, 190
3 C 123, 162, 185, 190, 82, 191
4 D 185
至于你的问题的标题所暗示的,用aggregate
:
aggregate(list(categories=df$categories), by=list(objects=df$objects), c)
# objects categories
# 1 A 162
# 2 B 162, 190
# 3 C 123, 162, 185, 190, 82, 191
# 4 D 185
骨料如果DF
是你的数据帧,然后试试这个:
aggregate(categories ~ objects, DF, function(x) toString(unique(x)))
sqldf随着sqldf这个工程:
library(sqldf)
sqldf("select objects, group_concat(distinct categories) as categories
from DF group by objects")
一个data.table
解决方案
library(data.table)
DT <- as.data.table(DF)
DT[,list(categories = list(categories)), by = objects]
## objects categories
## 1: A 162
## 2: B 162,190
## 3: C 123,162,185,190,82,191
## 4: D 185