【问题标题】:R - Join on data.table, selecting a different column based on value of another column in rowR - 在 data.table 上加入,根据行中另一列的值选择不同的列
【发布时间】:2013-08-12 22:35:07
【问题描述】:

我有两个数据表:

DT1 <- data.table(A=c('A', 'B', 'C'), idx=c(1,2,3))
DT2 <- data.table(idx=c(1,2,3), A=rep('foo', 3), B=rep('bar', 3), C=rep('baz', 3))

> DT1
   A idx
1: A   1
2: B   2
3: C   3

> DT2
   idx   A   B   C
1:   1 foo bar baz
2:   2 foo bar baz
3:   3 foo bar baz

我想解决这个问题:

> DT3
   idx value
1:   1   foo
2:   2   bar
3:   3   baz

基本上我想在idx上合并DT1DT2,但我只想要DT2中与DT1行中A的值相对应的列。 DT1 和 DT2 的行数相同,并且在行中的顺序相同

是否有 data.table 本地方式来执行此操作?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    在旧的(隐式)by-without-by 功能被替换为 by=.EACHI 之后更新了答案(并且还使用 on= 参数而不是设置键:

    require(data.table) # v1.9.6+
    DT2[DT1, .(value=get(i.A)), on="idx", by=.EACHI]
    #    idx value
    # 1:   1   foo
    # 2:   2   bar
    # 3:   3   baz
    

    【讨论】:

    • 太棒了,做到了。我刚刚看到你的另一个答案提到ij 中可用。有记录的地方吗?我见过提到.SD,但没有仔细看。
    • 我看到data.table帮助的by部分下有更多细节,但它没有提到i,只有.I
    • 可以使用 i.x. 前缀来引用 i 和 x 的列现在记录在 ?data.table (当前开发,v1.9.7)中。它也将很快添加到小插曲中。
    • @Arun 不确定这是否是新的 data.table 故障(v 1.10.4-3),但您的回答让我明白了Error in validate(cols, x) : cols value(s) [i.A] not present (or out of range) in x。包含一个额外的 get 修复它:DT2[DT1, .(value=get(get('i.A'))), on="idx", by=.EACHI]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    相关资源
    最近更新 更多