R data.table-删除与给定边距相对应的行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R data.table-删除与给定边距相对应的行相关的知识,希望对你有一定的参考价值。

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

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。即行号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
答案

不是真正的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
另一答案

数据表防联接

dt[!x, 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

Base 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
另一答案

另一个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

以上是关于R data.table-删除与给定边距相对应的行的主要内容,如果未能解决你的问题,请参考以下文章

如何计算 R 中 data.table 中的出现组合

R语言对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法data.tabledplyr等方案

通过R中的列的cumsum拆分data.table

R语言data.table导入数据实战:data.table设置键值(key)复合键设置删除键设置键值之后的数据连接(join)更加方便设置了键值之后可以使用keyby语法代替by语法

R语言构建xgboost模型:使用xgboost模型训练tweedie回归模型,特征工程(dataframe转化到data.table独热编码缺失值删除DMatrix结构生成)

R中的“不加入”