R data.table - 删除对应于给定边缘的行
R data.table - remove rows corresponding to a given marginal
我有以下问题。我有一个 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。M
和x
都在程序中变化。给定 M
和 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
不是真正的 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
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
另一个基础 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
我有以下问题。我有一个 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。M
和x
都在程序中变化。给定 M
和 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
不是真正的 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
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
另一个基础 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