【问题标题】:Conditional searching which omits NA values忽略 NA 值的条件搜索
【发布时间】:2015-10-20 22:38:10
【问题描述】:

我正在对每行中有多个 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))

当我使用此代码时(在此格式的较大扩展表上),它只返回没有任何 NA 的行,其中添加了所有值。考虑到使用“&”,这是有道理的。

我的问题是:有没有办法找到适合我的条件搜索的行,忽略 NA,但只返回所有列变量中提供值的行,它搜索 time1>slice1、time2>slice2 等.?

感谢任何帮助。谢谢。

【问题讨论】:

    标签: r subset conditional-statements


    【解决方案1】:

    您可以创建一个接受布尔值(可能是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)
    

    【讨论】:

    • 运行此命令后,我收到“is.na 中的错误(patiendata,TRUE,patientdata):3 个参数传递给 'is.na',需要 1”。 'code' all.smallerslice1)&na.true(time2>slice2)&na.true(time3>slice3)&na.true(time4>slice4),select=c(1 )) 你知道我做错了什么吗?
    • 实际上,我意识到我做错了什么 - 我应该按原样复制代码的第一部分(我误认为 x 是数据框)。感谢您的帮助!
    【解决方案2】:

    你可以试试这个。

    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 并强制为真,如果不是,则检查时间是否大于切片。 (针对每个索引单独列出。)如果您打印出conds 以查看它的外观,它会变得更加清晰。

    【讨论】:

      猜你喜欢
      • 2020-08-11
      • 2018-04-24
      • 2013-10-16
      • 1970-01-01
      • 2012-03-19
      • 2013-03-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      相关资源
      最近更新 更多