代码之家  ›  专栏  ›  技术社区  ›  steve zissou

dplyr:基于分组创建新变量

  •  1
  • steve zissou  · 技术社区  · 6 年前

    给定此数据帧:

    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 列。因此每个 身份证件 ,则在输出列中只能包含一种类型的值。这是希望的结果:

    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 回复  |  直到 6 年前
        1
  •  2
  •   akrun    6 年前

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

    这样就可以从 % % ,我们也可以使用 if/else

    df.ex %>%
        group_by(id) %>%
        mutate(var2 = if("b" %in% var1) "foo" else "bar")