Любые предложения по реализации фильтра внутри mutate с использованием dplyr или строк со всеми пропущенными случаями

Психологи почти все время работают со шкалами Лайкерта, и, допустим, у меня есть этот набор данных:

data <- data.frame(x1 = c(NA,2,4),
                   x2 = c(NA,3,2),
                   x3 = c(NA,6,NA))

Я хотел бы использовать RowSums только в том случае, если X1, X2 и X3 не отсутствуют.

Это не сработает, потому что не будут учитываться никакие переменные с пропущенными регистрами:

data %>%
  mutate(total_score = rowSums(select(.,x1:x3), na.rm=F))

И это тоже не сработает:

data %>%
  filter_at(vars(x1:x2), any_vars(!is.na(.))) %>% 
  mutate(total_score = rowSums(select(.,x1:x3), na.rm=T))

Потому что он отфильтрует мой набор данных, а затем уменьшит количество наблюдений.

Поэтому я хотел бы интегрировать фильтр в mutate.

Я прочитал сообщение перед этим, но мне не удалось его реализовать.

ps: Я хотел бы сохранить в окружении tidyverse. Спасибо

Мой код:

data <- data.frame(x1 = c(NA,2,4),
                   x2 = c(NA,3,2),
                   x3 = c(NA,6,NA))


data %>%
  mutate(total_score = rowSums(select(.,x1:x3), na.rm=F))

data %>%
  filter_at(vars(x1:x2), any_vars(!is.na(.))) %>% 
  mutate(total_score = rowSums(select(.,x1:x3), na.rm=T))

person Luis    schedule 29.04.2020    source источник
comment
Что плохого в использовании data %>% mutate(total_score = rowSums(select(.,x1:x3), na.rm=F))? Он даст NA, если есть хотя бы один NA, и суммирует ваши данные, только если все значения не NA. Разве ты не этого хочешь? Каков ваш ожидаемый результат?   -  person Ronak Shah    schedule 31.05.2021
comment
Этот пост был некоторое время назад. Моей целью на тот момент было не выдавать total_score, когда все значения отсутствовали. Спасибо за Ваш интерес !!   -  person Luis    schedule 01.06.2021


Ответы (1)


У меня работает следующее:

data <- data.frame(x1 = c(NA,2,4),
                   x2 = c(NA,3,2),
                   x3 = c(NA,6,NA))
mutate(data, tmp = x1+x2+x3)

Если вы намерены использовать функцию rowSums, то один из вариантов - сначала coalesce:

data %>%
  mutate_all(~{coalesce(.,-1000)}) %>% # replace all NA with -1000
  mutate(total_score = rowSums(select(.,x1:x3), na.rm=F)) %>%
  mutate_all(~{ifelse(.<0,NA,.)}) # replace any negative numbers with NA

Coalesce - это функция dplyr, которая возвращает первое значение, отличное от NA. Идея здесь в том, что если мы переносим нашу строковую сумму после замены всех NA на большие отрицательные числа, то любые отрицательные значения в результате должны исходить от NA. Конечно, это предполагает, что все ваши входные значения неотрицательны.

Если это незнакомо, для анонимных функций используется шаблон ~{.}. Итак, ~{coalesce(.,-1000)} эквивалентно function(x){coalesce(x,-1000)}

person Simon.S.A.    schedule 30.04.2020
comment
Спасибо! К сожалению, поскольку это решение заменяет отсутствующие случаи на -1000, я не могу получить общую оценку так, как я хочу. Первый ряд и третий ряд стали NA. Думаю, в моем вопросе было непонятно. Извините. Моя цель - суммировать x1, x2 и x3, только если x1, x2 и x3 (вместе) не пропущены. Если X1 отсутствует (а X2 и X3 нет), я хотел бы подвести итоги и т. Д. Спасибо - person Luis; 30.04.2020
comment
Итак, что насчет замены -1000 на 0 в первом mutate_all и замены <0 на ==0 во втором mutate_all? - person Simon.S.A.; 30.04.2020
comment
Спасибо! Постараюсь исправить по вашему предложению! знак равно - person Luis; 01.05.2020