【问题标题】:Subset r data.table conditionally using is.null()有条件地使用 is.null() 子集 r data.table
【发布时间】:2016-03-19 10:17:21
【问题描述】:

我有一个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$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() 条件?

【问题讨论】:

  • 我在问题中添加了一个额外的细节来阐明我在寻找什么。
  • 我正在尝试这样做,因为 a) 我正在使用 shiny 和 b) 我有 12 列作为子集。如果我这样做,那么我需要 144 (12^2) 个组合,而如果我能让它正常工作,那么它应该在 12 行中处理它。

标签: r null data.table subset


【解决方案1】:

使用语言计算,您可以使用专用函数准备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))]

如果您总是按两个条件和&amp; 运算符作为子集。我会将它合并到一个函数中,这样你就可以使用testDT[eval(i.expr(...))] 调用它一次。

【讨论】:

  • 出于某种原因,这对我不起作用。当我执行testDT1 时,它显示一个没有行的数据集。
  • @black_sheep07 这是适合您条件的正确结果,请尝试testDT[is.null(N) &amp; M %in% "w"]
  • G = NULL 时,我想返回N 的所有值,而不是一个都没有。
猜你喜欢
  • 2013-12-15
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 2014-04-20
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多