R 在单个列中聚合多个值

R 在单个列中聚合多个值,r,aggregate,R,Aggregate,我有以下数据集 data <- cbind(c(1,1,1,2,3,3,3,4,4,5,5,5,5), c(1112,1164,1339,395,1297,1440,1944,217,625,561,765,1022,1252)) 因为你的第二列不是一个数字,你不能在一个数字矩阵中有这个。这些数字必须转换成字符串,整个数据存储在一个数据帧中 > d=data.frame(data) > d X1 X2 1 1 1112 2 1 1164 3 1 1339

我有以下数据集

data <- cbind(c(1,1,1,2,3,3,3,4,4,5,5,5,5),
c(1112,1164,1339,395,1297,1440,1944,217,625,561,765,1022,1252))

因为你的第二列不是一个数字,你不能在一个数字矩阵中有这个。这些数字必须转换成字符串,整个数据存储在一个数据帧中

> d=data.frame(data)
> d
   X1   X2
1   1 1112
2   1 1164
3   1 1339
4   2  395
5   3 1297
6   3 1440
[etc]
现在我们只需使用
dplyr
并将每个X1类别中的X2值粘贴在一起:

> require(dplyr)
> d %>% group_by(X1) %>% summarise(X2=paste(X2,collapse=","))
Source: local data frame [5 x 2]

  X1                X2
1  1    1112,1164,1339
2  2               395
3  3    1297,1440,1944
4  4           217,625
5  5 561,765,1022,1252
请注意,X2中保存的是一个字符串“111211641339”,因此,要返回数值,您需要拆分逗号上的字符串并将其转换为数字

我只会使用这种转换来显示数据,它不是用于进一步处理的有用格式

您可以在一列的元素中存储多个值,但我总是发现它打破了某些函数对数据帧中的内容的期望

因此,从
d
开始,您可以执行以下操作:

> dwide = data.frame(X1=unique(d$X1), X2=tapply(d$X2, factor(d$X1),c))
> dwide
  X1                   X2
1  1     1112, 1164, 1339
2  2                  395
3  3     1297, 1440, 1944
4  4             217, 625
5  5 561, 765, 1022, 1252
然后您可以直接访问数字元素,但请确保方括号的数量正确:

> dwide$X2[[3]][2]
[1] 1440
下面是一个基本R选项(使用data.frame作为输入):


或使用
data.table

 library(data.table)
 setDT(as.data.frame(data))[,toString(V2), by=V1]
 #   V1                   V1
 #1:  1     1112, 1164, 1339
 #2:  2                  395
 #3:  3     1297, 1440, 1944
 #4:  4             217, 625
 #5:  5 561, 765, 1022, 1252

如果你说明为什么要这样做,你可能会得到更好的答案。@John,现有的答案有什么问题吗?:)如果这正是提问者所需要的,那么现有的答案没有错。但有一半以上的时间我收到这样的请求,需要的不是请求的(正如太空人的第一句话所暗示的)。此外,最好将此类请求的原因记录在案(请参阅关于好问题的常见问题)。而且,如果它更完整,更有可能提高提问者的声誉。而且。。。(我想这就够了)
aggregate(X2 ~ X1, data, FUN = toString)
#  X1                   X2
#1  1     1112, 1164, 1339
#2  2                  395
#3  3     1297, 1440, 1944
#4  4             217, 625
#5  5 561, 765, 1022, 1252
 library(data.table)
 setDT(as.data.frame(data))[,toString(V2), by=V1]
 #   V1                   V1
 #1:  1     1112, 1164, 1339
 #2:  2                  395
 #3:  3     1297, 1440, 1944
 #4:  4             217, 625
 #5:  5 561, 765, 1022, 1252