省略 NA 值的条件搜索

Conditional searching which omits NA values

我正在对数据集的一部分进行条件搜索,该数据集的每一行都有多个 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

我想做一些条件搜索,为每一行应用一个条件(比较一行中的一列是否大于另一列)。我想找到变量列(例如 time1)小于相应列(例如切片 1)的所有行(pt)。

all.smaller<-subset(patientdata, time1>slice1 & time2>slice2 & time3>slice3 & time4>slice4, na.rm=TRUE, select=c(1))

当我使用此代码时(在这种格式的更大扩展 table 上),它只有 returns 没有任何 NA 的行,其中添加了所有值。这是有道理的'&'的使用。

我的问题是:有没有一种方法可以找到哪些行适合我的条件搜索,该搜索忽略了 NA,但只有 returns 在所有提供值的列变量中的行,它搜索是否 time1> slice1, time2>slice2 等等?

感谢任何帮助。谢谢。

您可以创建一个接受布尔值(可能是 NA)的函数,如果它是 NA 则将其映射到 TRUE,否则它的值。

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)

你可以试试这个。

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 以查看它的外观,它会变得更加清晰。