在我的表格中,某些单元格是向量而不是单个值,即列是列表而不是向量:

dt1 <- data.table(
  colA=   c('A1','A2','A3'),
  colB=list('B1',c('B2a','B2b'),'B3'),
  colC=   c('C1','C2','C3'),
  colD=   c('D1','D2','D3')
)

dt1
#   colA    colB colC colD
#1:   A1      B1   C1   D1
#2:   A2 B2a,B2b   C2   D2
#3:   A3      B3   C3   D3


我需要将其整形为长格式,以取消列出该列colB。到目前为止,我是这样做的:

dt1[,.(colB=unlist(colB)),by=.(colA,colC,colD)]
#   colA colC colD colB
#1:   A1   C1   D1   B1
#2:   A2   C2   D2  B2a
#3:   A2   C2   D2  B2b
#4:   A3   C3   D3   B3


它可以完成工作,但是我不喜欢这样,我必须在by=中明确指出所有其他列名称。有更好的方法吗?
(我敢肯定它已经在其他地方回答了,但到目前为止我找不到)

附言理想情况下,我想在没有任何外部软件包的情况下进行管理

最佳答案

将我的评论提升为答案。使用:

dt1[,.(colB = unlist(colB)), by = setdiff(names(dt1), 'colB')]


给出:


   colA colC colD colB
1:   A1   C1   D1   B1
2:   A2   C2   D2  B2a
3:   A2   C2   D2  B2b
4:   A3   C3   D3   B3



或作为替代方案(@Frank的建议略有变化):

dt1[rep(dt1[,.I], lengths(colB))][, colB := unlist(dt1$colB)][]

08-07 17:07