问题
I have the following data frame in R:
objects categories
A 162
B 162
B 190
C 123
C 162
C 185
C 190
C 82
C 191
D 185
As you see there are objects and the categories they belong to. I would like to sum up the categories of each object in comma separated list to get a data frame which would look like this:
objects categories
A 162
B 162, 190
C 123, 162, 185, 190, 82, 191
D 185
How could I do this?
回答1:
This can be done with any of the aggregation tools of your choice, I'll show an example using plyr
package and paste()
function. This assumes your data is named 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
回答2:
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
回答3:
As the title of your question implies, use 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
回答4:
aggregate If DF
is your data frame then try this:
aggregate(categories ~ objects, DF, function(x) toString(unique(x)))
sqldf With sqldf this works:
library(sqldf)
sqldf("select objects, group_concat(distinct categories) as categories
from DF group by objects")
回答5:
A data.table
solution
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
来源:https://stackoverflow.com/questions/11635134/aggregate-values-from-several-fields-into-one