条件搜索省略了NA值

时间:2015-07-29 19:05:45

标签: r subset conditional-statements

我正在对每行中包含多个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等?

感谢任何帮助。谢谢。

2 个答案:

答案 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以查看它的外观,则会更清晰。