#r
#r
Вопрос:
У меня есть 6 разных столбцов: call_outcome_1 — call_outcome_6
Каждое из них может быть значением от 0 до 5 (0 = абонент достигнут, 2 = оставленное сообщение и т.д.)
Я пытаюсь выбрать строки, где ни один из этих 6 столбцов = 0 (иначе говоря, человек так и не был достигнут)
Однако некоторые из этих значений являются NA. Например, если пользователь был достигнут при первом вызове, то call_outcomes 2-6 будет NA.
Я пытался:
not_interviewed=data %>%
filter(call_outcome_1 !=0 amp; call_outcome_2!=0 amp; call_outcome_2 !=0 amp; call_outcome_3 !=0 amp; call_outcome_4 !=0 amp; call_outcome_5 !=0 amp; call_outcome_6 !=0) %>%
select(record_id)
not_interviewed
Это дает мне записи, в которых заполнены все 6 попыток вызова (без NAs), и ни одна из них не равна 0. Это исключает записи, в которых есть значения NA для любого из результатов. Я попробовал na.rm=FALSE и получаю ошибку. Буду признателен за любую помощь, я довольно новичок в R 🙂
Комментарии:
1. Сложно помочь без примеров данных, но как насчет
filter_at(your_df, vars(starts_with('call_outcome')), all_vars(. > 0 | is.na(.)))
Ответ №1:
Вы могли бы проверить, отличается ли оно от нуля или оно NA с помощью этого кода:
filter( (call_outcome_1 !=0 |is.na(call_outcome_1)==TRUE) amp; (call_outcome_2 !=0 |is.na(call_outcome_2)==TRUE) ...continue... amp; (call_outcome_6 !=0 |is.na(call_outcome_6)==TRUE)) )
Ответ №2:
Рассмотрим этот простой пример :
data <- data.frame(a = 1:5, call_outcome_1 = c(0, NA, 1, 2, 0),
call_outcome_2 = c(NA, 2, 1, 2, 3))
data
# a call_outcome_1 call_outcome_2
#1 1 0 NA
#2 2 NA 2
#3 3 1 1
#4 4 2 2
#5 5 0 3
Чтобы выбрать строки, где ни одно из значений не равно 0, вы можете использовать rowSums
cols <- grep('call_outcome', names(data))
data[rowSums(data[cols] == 0, na.rm = TRUE) == 0, ]
# a call_outcome_1 call_outcome_2
#2 2 NA 2
#3 3 1 1
#4 4 2 2