R 按ID分组,新表的每个元素都是一个向量

R 按ID分组,新表的每个元素都是一个向量,r,data.table,R,Data.table,我有一张这样的桌子 data.table(ID = c(1,2,3,4,5,6), R = c("s","s","n","n","s","s"), S = c("a","a","a","b","b","b")) 我正试图得到这个结果 a b s 1, 2 5, 6 n 3 4 data.table中是否有任何选项可以执行此操作?您可以尝试: library(dplyr) library(tidy

我有一张这样的桌子

data.table(ID = c(1,2,3,4,5,6), 
         R = c("s","s","n","n","s","s"), 
         S = c("a","a","a","b","b","b"))
我正试图得到这个结果

      a     b
s   1, 2      5, 6
n     3         4
data.table中是否有任何选项可以执行此操作?

您可以尝试:

library(dplyr)
library(tidyr)

df %>% 
  group_by(R, S) %>% 
  summarise(i = toString(ID)) %>% 
  spread(S, i) 
其中:

#Source: local data table [2 x 3]
#Groups: 
#
#  R    a    b
#1 n    3    4
#2 s 1, 2 5, 6
#Source: local data table [2 x 3]
#Groups: 
#
#  R        a        b
#1 n <dbl[1]> <dbl[1]>
#2 s <dbl[2]> <dbl[2]>
注意:这将结果存储在字符串中。如果需要更方便的格式来访问元素,可以将以下内容存储在列表中:

df2 <- df %>% 
  group_by(R, S) %>% 
  summarise(i = list(ID)) %>% 
  spread(S, i)  

您可以使用
restrape2
中的
dcast
和适当的聚合功能:

library(functional)
library(reshape2)

dcast(df, R~S, value.var='ID', fun.aggregate=Curry(paste0, collapse=','))
#  R   a   b
#1 n   3   4
#2 s 1,2 5,6
甚至如@akrun所强调的:

dcast(df, R~S, value.var='ID', toString)

下面是一个使用纯旧data.table语法的替代方案:

DT[,lapply(split(ID,S),list),by=R]

# or...

DT[,lapply(split(ID,S),toString),by=R]

我有6列和3行,但我认为这并不重要。我只需要每个不同组的ID。
DT[,paste0(ID,collapse=“,”),by=c(“R”,“S”)]
是一个开始,它没有给出一个向量,而是一个sting表示。只是扩展@Chris idea
dcast(DT[,paste0(ID,collapse=“,”),by=c(“R”,“S”)],R~S,value.var='V1'))克里斯考虑将其作为一个解决方案,从<代码>数据> <代码> dCase>代码>选项。表< /代码> @史蒂文波普尔,基本上是克里斯的想法。如果他没有发布解决方案,您可以添加它。功能是我的基本软件包:)非常适合
toString
DT[,lapply(split(ID,S),list),by=R]

# or...

DT[,lapply(split(ID,S),toString),by=R]