假设我具有以下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
)。是否有一种简单的方法来修改我的过滤器,以允许该列不存在的可能性?如果该列不存在,则过滤器将被忽略。
答案 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))]
最初,我要说的是测试要从循环中打破的条件的结束,并且不包括&
,但这将在每次循环中执行该操作。只需删除不需要的字符串" & "
的最后三个字符,只需执行一次。