gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:48:08 27 4
gpt4 key购买 nike

我有一个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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com