首页 > 解决方案 > 计算总和时有没有办法处理 NA?

问题描述

如果我没有很好地格式化这个问题,请提前抱歉,这是我第一次发布问题!

我有一张表格,其中患者为行,症状为列。症状响应为 0/1(不存在/存在)。我注意到输入数据的 3 种不同方式。(1) 所有数据都可用(患者 A),(2) 所有数据缺失(患者 D),或者只有一些列缺失数据,而其他列有响应(患者 B、C 或 E)。

> patient<- c('A','B','C','D', 'E')
> symptom1<- c(1,0,1,NA,1)
> symptom2<- c(0,NA,NA,NA,0)
> symptom3<- c(0,NA,NA,NA,NA)
> df<- data.frame(patient, symptom1, symptom2, symptom3)
> df
  patient symptom1 symptom2 symptom3
1       A        1        0        0
2       B        0       NA       NA
3       C        1       NA       NA
4       D       NA       NA       NA
5       E        1        0       NA

我想创建一个新列,“疾病”,响应为 0/1,这样如果患者有任何 1,那么疾病 ==1,但对于疾病 ==0,他们必须全为 0。本质上,当行中存在值时,我想忽略所有 NA,但如果一行完全是 NA,我想要 disease==NA。

我曾尝试使用 na.rm=TRUE 但正如您在患者 D 中看到的那样,它将 NA 视为 0:

> df$disease<- apply(df[2:4], 1, sum, na.rm=TRUE)
> df
  patient symptom1 symptom2 symptom3 disease
1       A        1        0        0       1
2       B        0       NA       NA       0
3       C        1       NA       NA       1
4       D       NA       NA       NA       0
5       E        1        0       NA       1

这是一个问题,因为如果所有列都是 NA,我们实际上没有足够的信息来说明患者没有出现任何症状——也许他们只是缺少数据。在这种情况下处理 NA 的任何经验/建议?

标签: rna

解决方案


一个选项sum_来自hablar

library(hablar)
df$disease <- apply(df[2:4], 1, sum_)
df$disease
#[1]  1  0  1 NA  1

或者使用OP的方法,我们可以有一个if/else条件

apply(df[2:4], 1, function(x) if(all(is.na(x))) NA_real_
          else sum(x, na.rm = TRUE))
#[1]  1  0  1 NA  1

或者另一个矢量化选项是

rowSums(df[-1], na.rm = TRUE) * NA^!rowSums(!is.na(df[-1]))
#[1]  1  0  1 NA  1

推荐阅读