我正在对每行中包含多个NA值的数据集的一部分进行条件搜索。
像这样(预览)......
time1 time2 time3 time4 slice1 slice2 slice3 slice4
pt1 1 3 NA NA NA 1 3 5
pt2 NA 1 3 5 5 2 2 4
我想做一些条件搜索,它为每一行应用一个条件(比较一行中的一列是否大于另一列)。我想找到所有行(pt' s),其中可变列(例如time1)小于相应的列(例如切片1)。
all.smaller<-subset(patientdata, time1>slice1 & time2>slice2 & time3>slice3 & time4>slice4, na.rm=TRUE, select=c(1))
当我使用此代码时(在此格式的较大扩展表上),它只返回没有任何NA的行,其中添加了所有值。这是有意义的,因为使用&#39;&amp;& #39;
我的问题是:有没有办法找到哪些行符合我的条件搜索忽略NA,但只返回所有列变量中提供值的行,它搜索time1&gt; slice1, time2&gt; slice2等?
感谢任何帮助。谢谢。
答案 0 :(得分:1)
你可以创建一个带布尔值(可能是NA
)的函数,如果它是TRUE
则将其映射到NA
,否则将其映射到na.true <- function(x) ifelse(is.na(x), TRUE, x)
。
na.true(time1 > slice1) & na.true(time2 > slice2) & na.true(time3 > slice3) & na.true(time4 > slice4)
然后,您可以用
替换您的子集{{1}}
答案 1 :(得分:1)
你可以试试这个。
n=1:4
cond <- paste0('((is.na(time',n,')|is.na(slice',n,'))|(time',n,'>slice',n,'))')
conds <- paste(cond, collapse=' & ')
all.smaller <- subset( patientdata, eval(parse(text=conds)) )
本质上,这会检查时间或切片是否为NA并强制为TRUE,如果不是,则检查时间是否大于切片。 (每个索引单独使用。)如果您打印conds
以查看它的外观,则会更清晰。