【问题标题】:R: Updating NAs in a data table with values of another data table [duplicate]R:使用另一个数据表的值更新数据表中的 NA [重复]
【发布时间】:2016-03-03 02:19:33
【问题描述】:

有如下结构的两个数据表:

 DT1 <- data.table(ID=c("A","B","C"), P0=c(1,10,100), key="ID")
 DT2 <- data.table(ID=c("B","B","B","A","A","A","C","C","C"), t=rep(seq(0:2),3), P=c(NA,30,50,NA,4,6,NA,200,700)) 

在数据表DT2P 列中的所有 NA 应由数据表 DT1 中的值 P0 更新。

如果DT2DT1一样被ID排序,问题可以这样解决:

 setorder(DT2,ID)
 idxr <- which(DT2[["t"]]==1)
 set(DT2, i=idxr, j="P", value=DT1[["P0"]])

但是数据表如何在不排序DT2之前“合并”呢?

【问题讨论】:

    标签: r merge data.table na


    【解决方案1】:

    这是另一种按条件加入的选项

    DT2[is.na(P), P := DT1[.SD, P0]]
    DT2
    #    ID t   P
    # 1:  B 1  10
    # 2:  B 2  30
    # 3:  B 3  50
    # 4:  A 1   1
    # 5:  A 2   4
    # 6:  A 3   6
    # 7:  C 1 100
    # 8:  C 2 200
    # 9:  C 3 700
    

    【讨论】:

      【解决方案2】:

      我们可以连接两个数据集on'ID',对于'P'中的NA值,我们将'P'分配为'P0',然后通过将'P0'分配给'NULL'来删除它。

      library(data.table)#v1.9.6+
      DT2[DT1, on='ID'][is.na(P), P:= P0][, P0:= NULL][]
      

      或者正如@DavidArenburg 提到的,我们可以在加入'ID' 后使用ifelse 条件来替换'P' 中的NA 元素。

      DT2[DT1, P := ifelse(is.na(P), i.P0, P), on = 'ID']
      

      【讨论】:

      • 我明白了,每个[]做了什么。这是一种接二连三的手术吗?
      • @kamath 类似于dplyr中的%&gt;%。我们正在更新每个操作的结果数据集。
      • 您可以使用ifelse 一步完成,就像DT2[DT1, P := ifelse(is.na(P), i.P0, P), on = 'ID'] 一样
      • @DavidArenburg 是的,谢谢,但我不确定ifelse 和 data.table 是否可以混淆。
      • @DavidArenburg 谢谢,我更新了。我在想ifelse 与分配相比会慢。
      猜你喜欢
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 2013-06-22
      • 2019-12-27
      • 2018-06-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多