dplyr:根据分组创建新变量

时间:2018-05-31 08:22:37

标签: r dplyr

鉴于此数据框:

df.iloc[(len(df)// 3) : (len(df)// 3 * 2), :]

我想根据(len(df.index)// 3) : (len(df.index)// 3 * 2)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')) 的存在来创建一个新变量var2bvar1列分组。因此,每个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

有没有人对如何做到这一点有任何想法?

1 个答案:

答案 0 :(得分:2)

我们可以使用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")