【问题标题】:updating "multiple" columns of "selected" rows of a data table with duplicate key values使用重复的键值更新数据表的“选定”行的“多个”列
【发布时间】:2015-06-02 05:43:37
【问题描述】:

我正在处理包含一百万行奇数行的数据表。它有一个非唯一的密钥。一个特定的列(比如 v1)有几行的 NA。当 v1 有 NA 时,我需要更新此列(v1)和另一列(v2)。更新这些列的值来自另一个数据表。以下代码模拟数据集:

set.seed(1)
DT1<-data.table(
        id1=c(rep(1, 3), rep(2, 3)), 
        id2=c("a", "e", "n", "e", "e", "c"), 
        v1=c(rnorm(1), rep(NA,2),  rnorm(1), NA, rnorm(1)), 
        v2=rnorm(6))
setkey(DT1, id2)

DT2<-data.table(id2=c("n","u", "e"), v1=c(1, 2, 3), v2=c(11, 22, 33))
setkey(DT2, id2)
DT1; DT2

更新后 DT1 将如下所示:

> DT1
   id1 id2         v1         v2
1:   1   a -0.6264538  1.5952808
2:   2   c -0.8356286  0.5757814
3:   1   e          3         33
4:   2   e  0.1836433  0.4874291
5:   2   e          3         33
6:   1   n          1         11

请注意,第 4 行没有更新,因为 v1 有一个值。

我尝试了以下代码,但它更新了所有匹配的行(包括第 4 行)

DT1[DT2[unique(DT1[is.na(v1), id2]),nomatch=0], c("v1","v2"):=list(i.v1,i.v2)]

如果我为上面的代码提供一个过滤器(如下所示),DT1 保持不变。

DT1[is.na(v1)][DT2[unique(DT1[is.na(v1), id2]),nomatch=0], c("v1","v2"):=list(i.v1,i.v2)]

我做错了什么?

为这样的问题编写 R/data.table 代码的更优雅的方法是什么?

请帮忙。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    这是一种可能性:

    DT1[is.na(v1), c("v1", "v2") := DT2[.SD[["id2"]], list(v1, v2)]]
    #   id1 id2         v1         v2
    #1:   1   a -0.6264538  1.5952808
    #2:   2   c -0.8356286  0.5757814
    #3:   1   e  3.0000000 33.0000000
    #4:   2   e  0.1836433  0.4874291
    #5:   2   e  3.0000000 33.0000000
    #6:   1   n  1.0000000 11.0000000
    

    【讨论】:

    • 不错的方法!我认为您将需要.SD$id2 而不仅仅是id2 ...它恰好在这种情况下起作用 IIUC
    • @Arun 我对那里的范围规则有点不确定。没有时间调查,所以我只是相信你。 :)
    • ? 当然。一旦我们有办法清楚地引用 DT 范围之外的变量,它就不会那么混乱了。但是我们已经说了一段时间了..?
    • @Arun,你能解释一下你提到的 .SD$id2 的重要性吗?这将有助于我更好地理解。感谢您的帮助。
    • 基肖尔,当然。 DT2[id2, ..] 将使用来自DT2id2 列,而您真正需要的是DT1id2,可以使用.SD(代表数据子集)访问它。在这种情况下,由于没有分组,.SD == DT1。所以你也可以DT1$id2.. 这有帮助吗?
    猜你喜欢
    • 2016-03-02
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2016-05-31
    相关资源
    最近更新 更多