Есть ли способ справиться с НС при определении суммы? - PullRequest
1 голос
/ 28 марта 2020

Заранее извините, если я не отформатирую этот вопрос отлично, я впервые пишу вопрос!

У меня есть таблица с пациентами в виде строк и симптомов в виде столбцов. Симптом ответа - 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, я хочу болезнь == 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, у нас фактически нет достаточно информации, чтобы сказать, что пациент не испытывает любые симптомы - может быть, они просто отсутствуют данные. Есть какой-нибудь опыт / предложения по работе с АН в такой ситуации?

1 Ответ

1 голос
/ 28 марта 2020

Опция sum_ из hablar

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

Или, используя подход ОП, мы можем получить условие 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...