dplyr: создать новую переменную на основе группировки - PullRequest
0 голосов
/ 31 мая 2018

Учитывая этот фрейм данных:

library(dplyr)
df.ex <- tibble(id = c(rep(1, 4), rep(2, 4), rep(3, 4)),
var1 = c('a','a','b','b','a','a','a','a','b','b','b','b'))

Я хотел бы создать новую переменную var2, основанную на наличии b в var1, которая сгруппирована по столбцу id.Таким образом, каждый id может содержать только один тип значения в выходном столбце.Это надежда на результат:

df.ex.outcome <- tibble(id = c(rep(1, 4), rep(2, 4), rep(3, 4)),
            var1 = c('a','a','b','b','a','a','a','a','b','b','b','b'),
            var2 = c(rep('foo', 4), rep('bar', 4), rep('foo', 4)))

Я думал, что использование group_by решит эту проблему, однако, похоже, это не сработает, вот так:

df.ex <- df.ex %>% group_by(id) %>% mutate(var2 = if_else(var1 %in% 'b', 'foo','bar'))

Кто-нибудьесть идеи как это сделать?

1 Ответ

0 голосов
/ 31 мая 2018

Мы можем обернуть с any

df.ex %>% 
  group_by(id) %>%
  mutate(var2 = case_when(any(var1 == "b")~ "foo", TRUE ~ "bar"))
# A tibble: 12 x 3
# Groups:   id [3]
#      id var1  var2 
#   <dbl> <chr> <chr>
# 1     1 a     foo  
# 2     1 a     foo  
# 3     1 b     foo  
# 4     1 b     foo  
# 5     2 a     bar  
# 6     2 a     bar  
# 7     2 a     bar  
# 8     2 a     bar  
# 9     3 b     foo  
#10     3 b     foo  
#11     3 b     foo  
#12     3 b     foo  

Или изменить аргументы для %in%

df.ex %>% 
   group_by(id) %>% 
   mutate(var2 = case_when("b" %in% var1 ~ "foo", TRUE ~ "bar"))

Или используя if_else

df.ex %>% 
      group_by(id) %>% 
      mutate(var2 = if_else('b' %in% var1, 'foo','bar'))

, так что из %in% будет один выход TRUE / FALSE, который мы также можем использовать с if/else

df.ex %>%
    group_by(id) %>%
    mutate(var2 = if("b" %in% var1) "foo" else "bar")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...