Как сравнить несколько переменных с помощью dplyr

#r #dplyr #tidyverse

Вопрос:

На данный момент мне нужен метод анализа имеющихся у меня данных, и было бы очень полезно, если бы вы могли сотрудничать со мной. Данные показаны, как в следующем примере:

 > glimpse(test)
Rows: 559
Columns: 4
$ Host.H <chr> "Human", "Human", "Human", "Human", "Human", "Human", "Human", "Human", "Human", "Human", "Human", "Human", "Hu…
$ Host.I <chr> NA, "Intermediate", "Intermediate", "Intermediate", "Intermediate", "Intermediate", "Intermediate", "Intermedia…
$ Host.B <chr> NA, "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", "Bat", NA, "Bat", "Bat"…
$ Host.C <chr> NA, "Consensus", "Consensus", "Consensus", "Consensus", "Consensus", "Consensus", "Consensus", "Consensus", "Co…
 

Эти данные соответствуют организмам, полученным от летучих мышей, промежуточного звена, человека и реплики (Хост.B, Хозяин.I, Хост.H и Хост.C). Можно обнаружить, что они не заполнены во всех ячейках, есть некоторые с недоступными данными, такими как N. A. Поэтому моя цель состоит в том, чтобы, если во всех переменных есть данные среди (Хост.B = Bat, Хост.I = Промежуточный, Хост.H = Человек и Хозяин. C = Консенсус) он присваивается новому столбцу под названием «тип» как «Сохраненный», в то время как, если среди переменных отсутствуют данные (Хост.B = N. A, Хозяин.I = Промежуточный, Хост.H = N. A и Хост.C = Консенсус) он идентифицируется как «Общий», и если в столбце есть только одни данные (Хост.B = Bat, Хост.Я = N. A, Хозяин.H = N. A и Хост.C = N. A) как «Уникальный».

Для этой цели я разработал следующий сценарий:

 test <- data %>%
  rowwise() %>%
  mutate(Type = case_when(
    all_eq(c(Host.H = Human, Host.C = Consensus, Host.B = Bat, Host.I = Intermediate), na.rm = T ~ "Conserved",
    all_neq(c(Host.H = Human, Host.C = Consensus, Host.B = Bat, Host.I = Intermediate), na.rm = T)) ~ "Unique",
    TRUE ~ "Shared"
  )) %>%
  ungroup()
 

К сожалению, это не работает для достижения нужной мне цели. По этой причине, если у вас есть более осуществимый способ выполнить эту операцию, мы будем вам очень признательны.

Спасибо.

Комментарии:

1. Пожалуйста, предоставьте свои данные, вставив dput(data)

Ответ №1:

Вы можете использовать rowSums для подсчета количества значений, отличных от NA, в кадре данных. На основании этого count вы можете назначить Type столбец.

 library(dplyr)

test <- test %>%
  mutate(count = rowSums(!is.na(.[c('Host.H', 'Host.I', 'Host.B', 'Host.C')])), 
         Type = case_when(count == 4 ~ 'Conserved', 
                          count > 1 ~ 'Shared', 
                          count == 1 ~ 'Unique'))
 

Вы можете удалить count столбец из выходных данных, включив %>% select(-count) его .

Комментарии:

1. Привет, Ронак, как я могу посчитать столбцы Host.H, Host.B, Host. I и хост.C только без использования функции «выбрать»? Ваш пример кода подсчитывает все NA в столбцах, которые мне не нужны.

2. @DiegoMunoz Ну, в glimpse нем было показано только 4 столбца, поэтому я специально не выбирал столбцы. Смотрите обновленный ответ, если это поможет.