【问题标题】:dplyr: create new variable based upon groupingdplyr:根据分组创建新变量
【发布时间】:2018-05-31 08:22:36
【问题描述】:

鉴于此数据框:

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'))

我想根据var1b 的存在创建一个新变量var2,该变量由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'))

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

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      • 2013-09-04
      相关资源
      最近更新 更多