Прежде всего, я думаю, что ответ на ваш вопрос
этот код подсчитывает количество раз, которое опрос имеет значение (не 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