3

更新示例: 我有一个功能如下:

myfun <- function(DT, var){  
  for(i in 1:length(var)){
    s = substitute(!(is.na(x) | is.nan(x)), list(x=as.symbol(eval(var[i]))))
    DT = DT[eval(s)]
  }
  return(DT)
}

输入:

> dt = data.table(id=c(1,2,3,4,5), x=c(1,2,NA,4,5), y=c(1,NA,3,4,NA))
> dt
   id  x  y
1:  1  1  1
2:  2  2 NA
3:  3 NA  3
4:  4  4  4
5:  5  5 NA

运行:

> myfun(dt, var=c("x", "y"))
   id x y
1:  1 1 1
2:  4 4 4
> myfun(dt, var=c("x"))
   id x  y
1:  1 1  1
2:  2 2 NA
3:  4 4  4
4:  5 5 NA

var是DT中一些变量的字符数组。目标是仅获取 DT 中没有任何NA或不包含任何NaN变量的行var

我不想要 for 循环。我想构建一个s包含所有条件的查询,然后对该查询进行评估DT。对于我想要的第一种情况:

s = !(is.na(x) | is.nan(x) | is.na(y) | is.nan(y))

对于我想要的第二种情况:

s = !(is.na(x) | is.nan(x))

如何构造一个动态查询并在数据表中将s其作为查询运行一次。i/where

更一般地说,我如何expression根据输入创建动态。使用expression(paste())对我没有帮助。然后我可以使用substitute.

4

1 回答 1

3

答:

var = c("x","y")
str=paste0("is.na(",var,") |", " is.nan(",var,")", collapse="|")
s = parse(text=paste("!(",str,")"))
DT[eval(s)]

来源: 如何在 data.table 中使用未知数量的键列

于 2013-09-04T14:39:28.010 回答