首页 > 解决方案 > 从长列到 grup 列表的 data.table

问题描述

我正在尝试将所有值按组“粘贴”到列表中。类似于 paste(x, collapse="-") 所做的事情,但输出应该是一个列表。我设法将其分为两个步骤。可以一步完成吗?

library("data.table")

d <- data.table( sample(letters, 100, replace = T), sample(LETTERS,100, replace = T)) %>%    unique

d[, paste0(V2, collapse = "--"), by=V1] %>% head
    V1               V1
1:  m       E--T--L--Q
2:  k    J--H--W--P--X
3:  v          D--W--X
4:  g          H--E--I
5:  c K--U--X--H--Y--N
6:  l    O--H--J--R--U

dd <- split(d, by="V1", keep.by=FALSE)
data.table(names(dd), sapply(dd, "[") ) %>% head
   V1          V2
1:  m     E,T,L,Q
2:  k   J,H,W,P,X
3:  v       D,W,X
4:  g       H,E,I
5:  c K,U,X,H,Y,N
6:  l   O,H,J,R,U

我也尝试过使用移位,但没有成功R data.table 按组创建列表列

标签: rdata.table

解决方案


我们可以把它包装在一个list

dd <- d[, .(V2 = list(V2)), V1]
head(dd)
#   V1              V2
#1:  c     Z,W,K,G,Q,A
#2:  a       V,X,T,D,K
#3:  w           Z,I,N
#4:  u N,Y,H,U,M,Z,...
#5:  d         G,M,D,B
#6:  q O,Z,K,V,I,X,...

str(dd)
#Classes ‘data.table’ and 'data.frame': 25 obs. of  2 variables:
# $ V1: chr  "c" "a" "w" "u" ...
# $ V2:List of 25
#  ..$ : chr  "Z" "W" "K" "G" ...
#  ..$ : chr  "V" "X" "T" "D" ...
#  ..$ : chr  "Z" "I" "N"
#  ..$ : chr  "N" "Y" "H" "U" ...
#  ..$ : chr  "G" "M" "D" "B"
# ..

推荐阅读