子集r data.table有条件地使用is.null()

时间:2015-12-14 01:26:06

标签: r null data.table subset

我有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))

我创建了一个有条件地对数据集进行子集化的函数。如果子集变量GNULLH"w",那么我希望testDT$N中的所有值和"w"中的所有值testDT$M要在testDT中返回1}}。这就是我创建的,它无法正常运行:

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()条件?

1 个答案:

答案 0 :(得分:3)

使用语言计算,您可以使用专用函数准备http://127.0.0.1:8080/test/some-module.js http://127.0.0.1:8080/static/test/some-module.js 个对象。

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))] 运算符进行子集化。我会将它合并为一个函数,因此您可以使用&调用它一次。