r - 计算总和时有没有办法处理 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 的任何经验/建议?
解决方案
一个选项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
推荐阅读
- node.js - 如何在没有端口号的情况下使用强制 HTTPS 重定向
- python - 如何使用 spacy 模型打印我的预测的 ner 标签(即使没有标签)?
- dll - 是否可以单独编译qooxdoo项目并链接它们?
- c++11 - 错误信息:Cube::init(): 请求的大小太大;建议使用 GWAS 的 sommer 包启用 ARMA_64BIT_WORD
- android - 元素在 UIAutomatorViewer 中可用,但在 android 10 的 appium 检查器中没有,但在 android 11 中都存在
- vba - Excel用户表单(VBA) - 如果选中复选框,如何在总计中添加值
- html - onClick="window.location='/viewAllAdmins';" 正在提交表单而不是转发到提供的链接
- spring - Elasticserach +Spring 数据 +数据插入 + PostgreSQL
- c# - 如何在 C# 中创建范围和同义词常量?
- stack - 在 MIPS 中读取堆栈上的地址返回 0 而不是 00400018