根据可能不存在的列进行过滤

时间:2019-12-11 22:50:32

标签: r data.table

假设我具有以下data.table结构。

demo <- data.table(a = rnorm(10),
                   b = rnorm(10)...
                   z = rnorm(10))

我可以用

对其进行过滤
data[a > -1.96 & b > -1.3 & c > -1.4...] 

但是有时会缺少多列(例如a)。是否有一种简单的方法来修改我的过滤器,以允许该列不存在的可能性?如果该列不存在,则过滤器将被忽略。

2 个答案:

答案 0 :(得分:2)

您可以尝试:

cols <- colnames(demo)
demo[ifelse("a" %in% cols, a > -1.96,TRUE) & ifelse("b" %in% cols, b > -1.3,TRUE) & ifelse("c" %in% cols, c > -1.4,TRUE),] 

这不是添加字母数量的简单方法,但是在讨论逻辑时却很简单。

答案 1 :(得分:2)

这是一种编程方式,可以根据存在的列构建过滤器。不确定您的应用程序,但是可以很容易地将其修改为从其他来源获取条件,而不是对其进行硬编码。

if(!(i %in% names(conditions))) next测试data.table中的列i是否作为conditions列表的元素存在。

library(data.table)

demo <- data.table(a = rnorm(10),
                   b = rnorm(10),
                   c = rnorm(10),
                   d = rnorm(10))

conditions <- list(a = ">0.5",
                   b = "<0",
                   z = "<0.5")

filter = ""
cols <- colnames(demo)

for(i in cols){
  if(!(i %in% names(conditions))) next
  filter <- paste0(filter, i, conditions[i], " & ")
}
filter <- substr(filter, 1, nchar(filter) - 3)

demo[eval(parse(text = filter))]

最初,我要说的是测试要从循环中打破的条件的结束,并且不包括&,但这将在每次循环中执行该操作。只需删除不需要的字符串" & "的最后三个字符,只需执行一次。