我有一个data.table
library(data.table)
testDT <- data.table(
L = (1:32),
M = rep(letters[23:26], each = 64),
N = rep(LETTERS[1:2], times = 2, each = 512),
O = rnorm(2048, 1))
testDT$L <- factor(testDT$L, levels = seq(from = 1, to = 32, by = 1))
我创建了一个函数来有条件地对数据集进行子集化。如果子集变量 G
是 NULL
并且 H
是 "w"
,那么我想要 中的所有值>testDT$N
和 testDT$M
中的所有值 "w"
将在 testDT
中返回。这是我创建的,但无法正常运行:
G <- NULL
H <- "w"
testDT1 <- testDT[if(is.null(G)) {eval(call("%in%", as.name("N"), G))} &
if(is.null(H)) {eval(call("%in%", as.name("M"), H))}]
我验证了除了 if(is.null())
部分之外的所有内容都可以通过创建它来正确工作:
G <- "A"
H <- "w"
testDT1 <- testDT[{eval(call("%in%", as.name("N"), G))} &
{eval(call("%in%", as.name("M"), H))}]
如何正确使用 is.null()
条件?
最佳答案
在语言上使用计算,您可以使用专用函数准备call
对象。
library(data.table)
testDT = data.table(
L = factor(1:32),
M = rep(letters[23:26], each = 64),
N = rep(LETTERS[1:2], times = 2, each = 512),
O = rnorm(2048, 1)
)
i.expr = function(var, x){
if(is.null(x)) TRUE
else call("%in%", as.name(var), x)
}
G = NULL
H = "w"
i.expr("N",G)
#[1] TRUE
i.expr("M",H)
#M %in% "w"
testDT1 = testDT[eval(i.expr("N",G)) & eval(i.expr("M",H))]
G = "A"
H = "w"
i.expr("N",G)
#N %in% "A"
i.expr("M",H)
#M %in% "w"
testDT2 = testDT[eval(i.expr("N",G)) & eval(i.expr("M",H))]
如果您总是按两个条件和 &
运算符进行子集化。我会将其合并为一个函数,这样您就可以使用 testDT[eval(i.expr(...))]
调用一次。
关于r - 使用 is.null() 有条件地子集 r data.table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34258477/