【问题标题】:Adding a new column with mutate and group by使用 mutate 和 group by 添加新列
【发布时间】:2019-04-21 17:35:41
【问题描述】:

我想根据前一列和按函数分组创建一个名为年龄的新列。数据集如下:

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

【问题讨论】:

  • 你试过什么?请举例说明您尝试过的一些策略/代码
  • 约翰不应该是 0,0,1,1 吗?
  • 不应该是 0,0,1,2 因为他的年龄将在后期递增到下一个值,即在 tid 1 中他是 0 ,2 他仍然是 0 ,当他变得活跃时,他在 3 中获得 1,在 4 中获得 2

标签: r dplyr plyr tidyr


【解决方案1】:

这能解决你的问题吗?

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.

【讨论】:

  • 为什么那里有 >0,1,0,0?不够通用,当活动总和=1时应该为0,然后递增
  • 谢谢,它成功了,您需要添加arrange(tid) 以使其更通用
【解决方案2】:

也可以完成这项工作的替代解决方案:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2018-03-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多