Условное изменение по столбцам в R - PullRequest
2 голосов
/ 31 марта 2020

Предположим, у вас есть tibble, например, так:

library(tidyverse)

df<-tibble(person = c("Alice", "Bob", "Mary"),
          likes_cheese = c("yes", "yes", NA),
          likes_ham = c("no", "yes", "yes"))

# A tibble: 3 x 3
  person likes_cheese likes_ham
  <chr>  <chr>        <chr>    
1 Alice  yes          no       
2 Bob    yes          yes      
3 Mary   NA           yes     

Как я могу условно изменить новый столбец, который объединяет строки? Мне нужно решение, которое будет игнорировать НС.

Ожидаемый результат:

tibble(person = c("Alice", "Bob", "Mary"),
       favourite_food = c("cheese", "cheese, ham", "ham"))

# A tibble: 3 x 2
  person favourite_food
  <chr>  <chr>         
1 Alice  cheese        
2 Bob    cheese, ham   
3 Mary   ham   

Ответы [ 3 ]

1 голос
/ 31 марта 2020

Мы можем получить данные в длинном формате, filter значения group_by person и summarise.

library(dplyr)

df %>%
 tidyr::pivot_longer(cols = -person, values_drop_na = TRUE) %>%
 filter(value == 'yes') %>%
 mutate(name = sub('likes_', '', name)) %>%
 group_by(person) %>%
 summarise(favourite_food = toString(name))

#  person favourite_food
#  <chr>  <chr>         
#1 Alice  cheese        
#2 Bob    cheese, ham   
#3 Mary   ham           
1 голос
/ 31 марта 2020
 df %>%
  mutate(
    favorite_food = paste0(
      if_else(likes_cheese == "yes" & !is.na(likes_cheese), "cheese,", ""),
      if_else(likes_ham == "yes" & !is.na(likes_ham), "ham", "")
    )
  ) %>% 
  select(-starts_with("likes"))

# A tibble: 3 x 2
  person favorite_food
  <chr>  <chr>        
1 Alice  cheese,      
2 Bob    cheese,ham   
3 Mary   ham    
0 голосов
/ 31 марта 2020

Вот вариант с melt

library(data.table)
melt(setDT(df), id.var = 'person', na.rm = TRUE)[value == 'yes', 
       .(favorite_food = toString(sub(".*_", "", variable))) , (person)]
#   person favorite_food
#1:  Alice        cheese
#2:    Bob   cheese, ham
#3:   Mary           ham
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...