Любые предложения по реализации фильтра в mutate с использованием dplyr или rowums со всеми пропущенными случаями - PullRequest
0 голосов
/ 30 апреля 2020

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

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))

1 Ответ

0 голосов
/ 30 апреля 2020

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

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 first:

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

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

...