【问题标题】:Assignment with data.table join operation, multiple matches使用 data.table 连接操作进行赋值,多个匹配
【发布时间】:2017-01-02 05:13:02
【问题描述】:

我有两个数据表:

dt1 = data.table(a=c('a','b'))
dt2 = data.table(a=c('a','b','b'))

合并dt1[dt2, on='a']

   a
1: a
2: b
3: b

所以当我执行dt1[dt2, on='a', c:= 1] 操作时,我期望

   a c
1: a 1
2: b 1
3: b 1

但是我得到了

   a c
1: a 1
2: b 1

这是为什么?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我们需要使用

    dt2[dt1, c := 1, on = "a"]
    dt2
    #   a c
    #1: a 1
    #2: b 1
    #3: b 1
    

    如果我们对更改初始数据集“dt1”不感兴趣,那么

    dt1[dt2, c(.SD, c= 1), on = 'a']
    #   a c
    #1: a 1
    #2: b 1
    #3: b 1
    

    OP 方法中的问题是,在连接之后,分配 (:=) 发生在第一个数据集 ('dt1') 中,并且它只有 2 行,因此,分配的值也将在那些2 行而不是 3 行。一种选择是将其分配给第二个数据集(如第一种方法所示),或者我们通过连接一个新列“c”来创建一个新数据集。

    【讨论】:

    • 您说“在加入之后”,但听起来分配发生在加入之前——对吗?
    • @sirallen 它基于连接,例如。 a1 <- data.table(a = 1:3); b1 <- data.table(a = 2:4);a1[b1, c:= 1,on = 'a']。您可以看到这种方法和a1[b1, c(.SD, c = 1), on = 'a'] 的区别
    猜你喜欢
    • 1970-01-01
    • 2019-02-24
    • 2014-03-02
    • 2021-05-10
    • 2011-01-01
    • 2018-06-24
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多