【问题标题】:R data.table - remove rows corresponding to a given marginalR data.table - 删除对应于给定边缘的行
【发布时间】:2020-02-07 13:59:20
【问题描述】:

我有以下问题。我有一个 data.table 和列的子集M。我在M 上定义了向量x

library(data.table)
data <- matrix(c(0,0,NA,1,0,1,NA,1,0,0,1,0,1,1,NA,NA,1,0,0,1,0,0,1,1,1,0,0,1,NA,0,1,1,0,1,1,1), byrow = T, ncol = 6, dimnames = LETTERS[1:6])
dt <- data.table(data)
dt
%     A B  C  D  E F
% 1:  0 0 NA  1  0 1
% 2: NA 1  0  0  1 0
% 3:  1 1 NA NA  1 0
% 4:  0 1  0  0  1 1
% 5:  1 0  0  1 NA 0
% 6:  1 1  0  1  1 1

M = LETTERS[2:5]
x <- dt[2,..M]
x
%    B C D E
% 1: 1 0 0 1

我想从dt 中删除所有行,其中M 上的边际等于x。 IE。行号2 和 4。Mx 在程序期间都会发生变化。给定 Mx 的结果将是:


   A B  C  D  E F
1: 0 0 NA  1  0 1
2: 1 1 NA NA  1 0
3: 1 0  0  1 NA 0
4: 1 1  0  1  1 1

【问题讨论】:

    标签: r data.table delete-row


    【解决方案1】:

    data.table 反连接

    dt[!x, on = M] # also works: dt[!dt[2], on = M]
    
    #    A B  C  D  E F
    # 1: 0 0 NA  1  0 1
    # 2: 1 1 NA NA  1 0
    # 3: 1 0  0  1 NA 0
    # 4: 1 1  0  1  1 1
    

    基础R

    eq2 <- Reduce('&', lapply(dt[, ..M], function(x) x == x[2]))
    
    dt[-which(eq2),]
    #    A B  C  D  E F
    # 1: 0 0 NA  1  0 1
    # 2: 1 1 NA NA  1 0
    # 3: 1 0  0  1 NA 0
    # 4: 1 1  0  1  1 1
    

    【讨论】:

      【解决方案2】:

      不是真正的data.table 选项,但使用base R 你可以这样做:

      data[rowSums(sweep(data[, M], 2, FUN = `==`, x), na.rm = TRUE) != length(x), ]
      
           A B  C  D  E F
      [1,] 0 0 NA  1  0 1
      [2,] 1 1 NA NA  1 0
      [3,] 1 0  0  1 NA 0
      [4,] 1 1  0  1  1 1
      

      【讨论】:

        【解决方案3】:

        另一种基础 R 解决方案

        > subset(dt,!data.frame(t(dt[,..M])) %in% data.frame(t(x)))
           A B  C  D  E F
        1: 0 0 NA  1  0 1
        2: 1 1 NA NA  1 0
        3: 1 0  0  1 NA 0
        4: 1 1  0  1  1 1
        

        【讨论】:

          猜你喜欢
          • 2016-04-06
          • 2023-02-25
          • 2015-01-26
          • 1970-01-01
          • 1970-01-01
          • 2016-02-08
          • 1970-01-01
          • 2014-05-04
          • 1970-01-01
          相关资源
          最近更新 更多