我想根据两个分组变量在数据框中聚合一列,并用逗号分隔各个值。
这里有一些数据:
data <- data.frame(A = c(rep(111,3),rep(222,3)),B = rep(1:2,C = c(5:10)) data # A B C # 1 111 1 5 # 2 111 2 6 # 3 111 1 7 # 4 222 2 8 # 5 222 1 9 # 6 222 2 10
“A”和“B”是分组变量,“C”是我要折叠成逗号分隔的字符串的变量。我努力了:
library(plyr) ddply(data,.(A,B),summarise,test = list(C)) A B test 1 111 1 5,7 2 111 2 6 3 222 1 9 4 222 2 8,10
但是当我尝试将测试列转换为字符时,它变成如下:
ddply(data,test = as.character(list(C))) # A B test # 1 111 1 c(5,7) # 2 111 2 6 # 3 222 1 9 # 4 222 2 c(8,10)
如何保留字符格式并用逗号分隔?例如,第1行应该只有“5,7”,而不是c(5,7)。
plyr尝试使用toString:
# plyr library(plyr) ddply(data,summarize,C = toString(C))
这里还有一些额外的替代方法也使用toString:
data.table
# alternative using data.table library(data.table) as.data.table(data)[,toString(C),by = list(A,B)]
聚合这不使用包:
# alternative using aggregate from the stats package in the core of R aggregate(C ~.,data,toString)
sqldf
这里是使用sql功能group_concat使用sqldf package的另一种方法:
library(sqldf) sqldf("select A,B,group_concat(C) C from data group by A,B",method = "raw")
dplyr替代品:
library(dplyr) data %>% group_by(A,B) %>% summarise(test = toString(C)) %>% ungroup()