Будет ли этот код R считать, сколько представлений в опросе имели значения для всех 4 из этих переменных? - PullRequest
0 голосов
/ 21 февраля 2020

Я учу себя R, и я думаю, что этот код подсчитывает количество раз, которое опрос имеет значение (не NA) для всех 4 из этих переменных в ()?

Может кто-нибудь подтвердить или исправить меня? Спасибо за помощь нервного новичка ie. Мне нужен этот номер для знаменателя (опросы без пропущенных данных). Спасибо!

sum(!is.na(Both_hwstations) & 
    !is.na(Both_latrines) & 
    !is.na(rapid_unique$hf_ipcfocal) & 
    !is.na(rapid_unique$water_avail)
)

1 Ответ

1 голос
/ 21 февраля 2020

Прежде всего, я думаю, что ответ на ваш вопрос

этот код подсчитывает количество раз, которое опрос имеет значение (не NA) для всех 4 из этих переменных в ()?

- это да ... точнее да, , но ..

Просто чтобы проиллюстрировать то, что все комментируют:

Это упрощенная версия проблемы:

varA <- c(7:10)
varB <- c(1:3, NA)
df <- data.frame(v1 = 1:4,
                 v2 = 11:14)

Все, varA, varB и df имеют длину 4 или 4 строки соответственно.

varA

[1]  7  8 9 10

varB

[1]  1  2  3 NA

df

  v1 v2
1  1 11
2  2 12
3  3 13
4  4 14

Ваш код суммы

sum(!is.na(varA) & 
    !is.na(varB) & 
    !is.na(df$v1) & 
    !is.na(df$v2))

Возвращает:

[1] 3

Поскольку он использует TRUE как 1 и FALSE как 0 при попытке сделать математику с логическими значениями , Пока все хорошо ...

Но если мы изменим векторы на

varA <- c(NA, 0)
varB <- c(1)

varA

[1]  NA 0

varB

[1]  1

Каким будет ожидаемый результат кода суммы в этом случае? Один ряд с не NA? Результат кода суммы теперь зависит от несколько уникальных c способов, которыми R обрабатывает эту ситуацию, когда векторы имеют разную длину:

sum(!is.na(varA) & 
      !is.na(varB) & 
      !is.na(df$v1) & 
      !is.na(df$v2))

Возвращает:

[1] 2

Потому что R (в фон) удваивается varA, чтобы сделать его такой же длины, как df$v1 И varB было повторено четыре раза по этому вопросу ...

По этой и другим причинам часто безопаснее сначала явно связать столбцы вместе, а затем использовать что-то вроде complete.cases для проверки этих вещей. Таким образом, мы можем быть уверены (э), что мы не ошибочно принимаем артефакты языка программирования как данные;)

Вместо этого мы можем сделать:

df$varA <- varA
df$varB <- varB
df

  v1 v2 varA varB
1  1 11    7    1
2  2 12    8    2
3  3 13    9    3
4  4 14   10   NA

И использовать базу R s complete.cases:

df[complete.cases(df), ]


  v1 v2 varA varB
1  1 11    7    1
2  2 12    8    2
3  3 13    9    3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...