代码之家  ›  专栏  ›  技术社区  ›  user3570187

添加带有mutate和group by的新列

  •  0
  • user3570187  · 技术社区  · 7 年前

    我想基于前一列和GroupBy函数创建一个名为Age的新列。数据集如下:

    tid<- c(1,2,3,4, 1,2,3,4,1,2,3,4)
    active<- c(0,1,0,4, 0,0,0,1,0,0,1,0)
    person<- c('John', 'John','John', 'John', 'Emma', 'Emma','Emma','Emma', 'Edward', 'Edward', 'Edward', 'Edward')
    df<- data.frame(tid, active, person)
    

    我想创建一个从0开始的年龄,当这个人第一次活动时,也就是说,活动的值第一次大于0,然后以一个值递增地添加到下一个记录中。有什么建议吗?

    我预计产量如下:

     name     age 
     John     0
     John     0
     John     1
     John     2
     Emma     0
     Emma     0
     Emma     0
     Emma     0
     Edward   0
     Edward   0
     Edward   0
     Edward   1
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   davsjob    7 年前

    这能帮你解决问题吗?

    library(dplyr)
    
    df %>% 
      group_by(person) %>% 
      arrange(person, tid) %>%
      mutate(active_dummy = if_else(lag(cumsum(active)) > 0, 1, 0, 0),
             age = cumsum(active_dummy)) %>% 
      select(person, age)
    

    给你

    # A tibble: 12 x 2
    # Groups:   person [3]
       person   age
       <chr>  <dbl>
     1 John      0.
     2 John      0.
     3 John      1.
     4 John      2.
     5 Emma      0.
     6 Emma      0.
     7 Emma      0.
     8 Emma      0.
     9 Edward    0.
    10 Edward    0.
    11 Edward    0.
    12 Edward    1.
    
        2
  •  0
  •   vectorson    7 年前

    另一种解决方案也能完成这项工作:

    library(tidyverse)
    
    age_counter = df %>% 
        arrange(tid) %>%
        group_by(person) %>% 
        filter(cumsum(active) > 0) %>% 
        mutate(age = row_number() - 1)
    
    df %>% 
        left_join(age_counter) %>%
        replace_na(list(age = 0)) %>%
        select(person, age)