r - How to manipulate data.frame in the data.table
问题描述
I have the data.table
where some columns of observations contain data.frame
. For example:
data.table(colA= c('A1','A2','A3'),
colB=list(data.frame(),
data.frame(colsubB1=c('B2a','B2b'),colsubB2=c('B2c', 'B2d')),
data.frame(colsubB1=c('A3a','A3b'),colsubB2=c('A3c', 'A3d'))),
colC= c('C1','C2','C3'),
colD= c('D1','D2','D3')
)
return,
colA colB colC colD
1: A1 <data.frame> C1 D1
2: A2 <data.frame> C2 D2
3: A3 <data.frame> C3 D3
I expect the following result:
colA colsubB1 colsubB2 colC colD
1: A1 <NA> <NA> C1 D1
2: A2 B2a B2c C2 D2
3: A2 B2b B2d C2 D2
4: A3 A3a A3c C3 D3
5: A3 A3b A3d C3 D3
Could you please give some suggestion?
解决方案
使用by
:
DT[, if(nrow(colB[[1L]]) > 0)
colB[[1L]]
else
data.frame(colsubB1=NA_character_, colsubB2=NA_character_),
by=setdiff(names(DT), "colB")]
输出:
colA colC colD colsubB1 colsubB2
1: A1 C1 D1 <NA> <NA>
2: A2 C2 D2 B2a B2c
3: A2 C2 D2 B2b B2d
4: A3 C3 D3 A3a A3c
5: A3 C3 D3 A3b A3d
数据:
library(data.table)
DT <- data.table(colA= c('A1','A2','A3'),
colB=list(data.frame(),
data.frame(colsubB1=c('B2a','B2b'),colsubB2=c('B2c', 'B2d')),
data.frame(colsubB1=c('A3a','A3b'),colsubB2=c('A3c', 'A3d'))),
colC= c('C1','C2','C3'),
colD= c('D1','D2','D3')
推荐阅读
- angularjs - AngularJS 组件和等待同步功能
- java - 更改返回堆栈活动按钮状态
- python - 创建一个返回新字典的函数
- azure - VM 数据磁盘使用的存储帐户
- c# - 检查树节点的 ACL 角色权限
- kubectl - 如何获取 Kubernetes 机密文件?
- json - 使用泛型和 Decodable 解码 JSON 数组
- angular - Angular Material: mat-dialog 打开多个对话框。退订?
- excel - 试图改变 Cell 的 Comment 对象的属性。Excel生成的宏不起作用
- microsoft-graph-api - 使用 Microsoft Graph API 的 Webhook 通知