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

时间:2015-07-21 15:33:23

标签: 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中有没有选项可以做到这一点?

3 个答案:

答案 0 :(得分:5)

这是一种使用普通旧data.table语法的替代方法:

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

# or...

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

答案 1 :(得分:4)

您可以使用dcast中的reshape2和相应的聚合函数:

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)

答案 2 :(得分:1)

你可以尝试:

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

注意:这会将结果存储在字符串中。如果您想要更方便的格式来访问元素,可以存储在列表中:

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

给出了:

#Source: local data table [2 x 3]
#Groups: 
#
#  R        a        b
#1 n <dbl[1]> <dbl[1]>
#2 s <dbl[2]> <dbl[2]>

然后您可以通过执行以下操作来访问元素:

> df2$a[[2]][2]
#[1] "2"