【问题标题】:How to replace a certain value in one data.table with values of another data.table of same dimension如何将一个data.table中的某个值替换为另一个相同维度的data.table的值
【发布时间】:2018-05-07 10:27:55
【问题描述】:

给定两个data.table:

dt1 <- data.table(id = c(1,-99,2,2,-99), a = c(2,1,-99,-99,3), b = c(5,3,3,2,5), c = c(-99,-99,-99,2,5))
dt2 <- data.table(id = c(2,3,1,4,3),a = c(6,4,3,2,6), b = c(3,7,8,8,3), c = c(2,2,4,3,2))

> dt1
    id   a b   c
1:   1   2 5 -99
2: -99   1 3 -99
3:   2 -99 3 -99
4:   2 -99 2   2
5: -99   3 5   5

> dt2
   id a b c
1:  2 6 3 2
2:  3 4 7 2
3:  1 3 8 4
4:  4 2 8 3
5:  3 6 3 2

如何将 dt1 的 -99 替换为 dt2 的值?

想要的结果应该是 dt3:

> dt3
   id a b c
1:  1 2 5 2
2:  3 1 3 2
3:  2 3 3 4
4:  2 2 2 2
5:  3 3 5 5

【问题讨论】:

标签: r data.table


【解决方案1】:

您可以执行以下操作:

dt3 <- as.data.frame(dt1)
dt2 <- as.data.frame(dt2)
dt3[dt3 == -99] <- dt2[dt3 == -99]
dt3

#   id a b c
# 1  1 2 5 2
# 2  3 1 3 2
# 3  2 3 3 4
# 4  2 2 2 2
# 5  3 3 5 5

【讨论】:

    【解决方案2】:

    如果您的数据都是同一类型(如您的示例中所示),那么将它们转换为 matrix 会更快且更透明:

    dt1a <- as.matrix(dt1)  ## convert to matrix
    dt2a <- as.matrix(dt2)
    
    # make a matrix of the same shape to access the right entries
    missing_idx <- dt1a == -99  
    dt1a[missing_idx] <- dt2a[missing_idx]  ## replace by reference
    

    这是一个矢量化操作,所以应该很快。

    注意:如果您这样做,请确保两个数据源在形状和行/列的顺序上完全匹配。如果他们不这样做,那么您需要通过相关键加入并选择正确的列。

    编辑:可能不需要转换为矩阵。有关更简洁的解决方案,请参阅 kath 的答案。

    【讨论】:

      【解决方案3】:

      简单的方法是使用setDF函数转换为data.frame并使用数据框子设置方法。最后恢复到data.table

      #Change to data.frmae
      setDF(dt1)
      setDF(dt2)
      
      # Perform assignment 
      dt1[dt1==-99] = dt2[dt1==-99]
      
      # Restore back to data.table    
      setDT(dt1)
      setDT(dt2)
      
      dt1
      #   id a b c
      # 1  1 2 5 2
      # 2  3 1 3 2
      # 3  2 3 3 4
      # 4  2 2 2 2
      # 5  3 3 5 5
      

      【讨论】:

        【解决方案4】:

        这个简单的技巧会很有效。

        dt1<-as.matrix(dt1)
        dt2<-as.matrix(dt2)
        
        index.replace = dt1==-99
        dt1[index.replace] = dt2[index.replace]
        
        as.data.table(dt1)
        as.data.table(dt2)
        

        【讨论】:

          【解决方案5】:

          这应该可行,一个简单的方法:

            for (i in 1:nrow(dt1)){
              for (j in 1:ncol(dt1)){
              if (dt1[i,j] == -99) dt1[i,j] = dt2[i,j]
              }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-12-24
            • 1970-01-01
            相关资源
            最近更新 更多