Создайте столбец, чтобы указать наличие значения в других столбцах - PullRequest
2 голосов
/ 29 мая 2020

У меня есть набор данных с симптомами (20+), симптомы классифицируются как Да / Нет / Неизвестно. Я хотел бы создать новый столбец, в котором будет указано, нет ли у субъекта (ID) симптомов (я определяю это, поскольку у них нет симптомов, с помощью «Да»).

У меня есть образец набор данных ниже, и я могу создать столбец по желанию, но похоже, что должен быть лучший / более чистый способ, просто используя dplyr::mutate(), а не фильтрацию и присоединение, которые я делаю?

library(dplyr)

test <- tibble(
  ID = c(1:10),
  col1 = sample(c("Yes", "No", "Unknown"), 10, replace = TRUE),
  col2 = sample(c("Yes", "No", "Unknown"), 10, replace = TRUE),
  col3 = sample(c("Yes", "No", "Unknown"), 10, replace = TRUE)
)

left_join(test, test %>%
  filter_at(vars(col1:col3), any_vars(. == "Yes")) %>%
  mutate(any_symptoms = "Yes") %>%
  select(ID, any_symptoms),
by = "ID"
) %>%
  mutate(any_symptoms = recode(any_symptoms, .missing = "No"))
#> # A tibble: 10 x 5
#>       ID col1    col2    col3    any_symptoms
#>    <int> <chr>   <chr>   <chr>   <chr>       
#>  1     1 Unknown Unknown Unknown No          
#>  2     2 Unknown No      No      No          
#>  3     3 Yes     Yes     Unknown Yes         
#>  4     4 No      Unknown Unknown No          
#>  5     5 No      No      Unknown No          
#>  6     6 Unknown Yes     Unknown Yes         
#>  7     7 Yes     Unknown Unknown Yes         
#>  8     8 No      No      No      No          
#>  9     9 No      Unknown Unknown No          
#> 10    10 No      No      No      No

Создано 29 мая 2020 г. пакетом REPEX (v0.3.0)

Ответы [ 3 ]

4 голосов
/ 29 мая 2020

Вы можете использовать rowSums, чтобы проверить, есть ли у вас более 0 "yes" подряд.

test$any_symptoms <- c('No', 'Yes')[(rowSums(test[-1] == 'Yes') > 0) + 1]

Вы также можете использовать это в dplyr трубах:

library(dplyr)
test %>% mutate(any_symptoms = c('No', 'Yes')[(rowSums(.[-1] == 'Yes') > 0) + 1])

Или используя pmap из purrr

library(purrr)
test %>%
    mutate(any_symptoms = c('No', 'Yes')[pmap_lgl(select(., starts_with('col')), 
                                        ~any(c(...) == 'Yes')) + 1])
1 голос
/ 29 мая 2020

Это работает, но может немного раздражать, если у вас 20 столбцов:

test %>% mutate(any_symptoms = case_when(grepl("Yes", paste(col1, col2, col3), fixed = TRUE) ~ "Yes", TRUE ~ "No"))
1 голос
/ 29 мая 2020

Это должно работать:

test %>% 
  left_join(
    test %>% 
      pivot_longer(-ID) %>% 
      group_by(ID) %>% 
      mutate(is_yes = value == "Yes") %>% 
      summarise(any_symptoms = ifelse(sum(is_yes) > 0, "Yes", "No"))
  )
...