在我的表格中,某些单元格是向量而不是单个值,即列是列表而不是向量:
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)][]