r - 通过匹配对应的列,根据另一个表条件有效地添加一个 data.table 长度
问题描述
我有两个 data.table 对象:
dt <- data.table(
a = c(1, 1, 2),
s = c(1, 2, 5),
o = c("A", "A", "A")
)
dt2 <- data.table(
a = c(1, 1, 2, 2),
g = c(1, 2, 3, 4)
)
dt2中的每个a都有g的两个元素。我想将a in dt与a in dt2匹配。然后在dt中,每行将重复 2 次(因为 dt2 中的每个 a 都有 2 个元素。当然, dt2 中的每个a可能有不同数量的元素。这意味着dt2中的条件决定了我如何附加相应的g的dt2到dt),并附加相应的g的dt2在dt的最后一列。决赛桌应该是这样的:
fnl <- data.table(
a = c(1, 1, 1, 1, 2, 2),
s = c(1, 1, 2, 2, 5, 5),
o = c("A", "A", "A", "A", "A", "A"),
g = c(1, 2, 1, 2, 3, 4)
)
为了清楚起见,这里是两个输入表和一个输出表。
> dt
a s o
1: 1 1 A
2: 1 2 A
3: 2 5 A
> dt2
a g
1: 1 1
2: 1 2
3: 2 3
4: 2 4
> fnl
a s o g
1: 1 1 A 1
2: 1 1 A 2
3: 1 2 A 1
4: 1 2 A 2
5: 2 5 A 3
6: 2 5 A 4
我知道使用 for-loop 我可以完成任务,但是我的数据太大,你能帮忙弄清楚什么是有效的方法吗?
解决方案
由于您使用的是 data.tables 这很容易:
dt[dt2, on='a']
给你
> dt[dt2, on='a']
a s o g
1: 1 1 A 1
2: 1 2 A 1
3: 1 1 A 2
4: 1 2 A 2
5: 2 5 A 3
6: 2 5 A 4
推荐阅读
- javascript - 为什么这个构造方法无效?
- vue.js - TypeError:无法读取 Vue-i18n 上未定义的属性“应用”
- google-drive-api - 如何在没有完全驱动范围权限的情况下使用 appDataFolder 和 Google Picker?
- hadoop - 名称节点和辅助名称节点未启动
- php - 从多维数组php中获取对象
- python - 如何在特定条件下获得回文数的总和?
- amazon-web-services - 使用 RDS 后端修改 AWS Amplify 中的解析器
- html - 在 mat-card 上绑定 Datepicker 事件
- typescript - TS2367:此条件将始终返回“假”与任何
- java - 向数据集添加一个新列并使用 Java spark 从数组中的值填充它