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

标签 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))

我创建了一个函数来有条件地对数据集进行子集化。如果子集变量 GNULL 并且 H"w",那么我想要 中的所有值>testDT$NtestDT$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/

相关文章:

r - 在不指定开始和结束日期的情况下将 .xts 强制转换为 .ts

r - S4 类交叉引用 - 什么是合适的语法?

r - R 中的元素和多个向量

r - 在数据表中查找和子集模式

r - 使用另一个表中的数据连接和覆盖一个表中的数据

r - R 中使用递归函数吗?

vb.net - VB.NET 中的 'foo = Nothing' 和 'foo is Nothing' 有什么区别?

sql - 左边连接两张表,若为空则默认为0

arrays - 如何检查我的 Ruby 数组中的每个对象是否都具有 nil 属性?

r - 在 data.frame 中的列中解包和合并列表