我有以下数据集
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))
我希望结果在两列中看起来像这样,而不是每个值
一列 [,1] [,2]
[1,] 1 1112,1164,1339
[2,] 2 395
[3,] 3 1297,1440,1944
[4,] 4 217,625
[5,] 5 561,765,1022,1252
答案 0 :(得分:2)
由于您的第二列不是数字,因此您无法在数字矩阵中使用此列。数字必须转换为字符串,整个数据存储在数据框中。
> 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中保存的是一个字符串&#34; 1112,1164,1339&#34;,因此要获取数值,您需要在逗号上拆分字符串并转换为数字。
我只会使用此转换来显示数据,它不是进一步处理的有用格式。
你可以在列的元素中存储多个值,但我总是发现它会破坏某些功能&#39;对数据框架内可能存在的期望......
首先从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
答案 1 :(得分:2)
这里是一个基本R选项(使用data.frame作为输入):
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
答案 2 :(得分:2)
或使用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