【问题标题】:Something like conditional seq_along on grouped data类似条件 seq_along 对分组数据
【发布时间】:2015-06-09 15:10:22
【问题描述】:

我正在尝试生成观察结果的“情节”,将观察结果组合在一起</= 相隔 14 天。 使用 dplyr,我设法计算了自上次观察以来的天数。但是,我无法弄清楚如何在没有 for 循环的情况下根据条件 </= 14 获取新 id。

样本数据:

#obsvn is number of days since first observation in group

dat <- data.frame(id = c(rep("A",5), rep("B", 2)), 
                  obsvn = c(1, 2, 29, 30, 45, 1, 15))
  id obsvn
1  A     1
2  A     2
3  A    29
4  A    30
5  A    45
6  B     1
7  B    15

预期输出:

  id obsvn ith
1  A     1    1
2  A     2    1
3  A    29    2
4  A    30    2
5  A    45    3
6  B     1    1
7  B    15    2

我尝试过使用延迟来

dat <- dat %>% 
  group_by(id) %>% 
  mutate(ith = 1,
         ith = ifelse(obsvn - lag(obsvn) <= 14, lag(ith), lag(ith)+1))
dat
Source: local data frame [7 x 3]
Groups: id

  id obsvn ith
1  A     1  NA
2  A     2   1
3  A    29   2
4  A    30   1
5  A    45   2
6  B     1  NA
7  B    15   1

这不是我想要的。我不明白为什么第 4 行中的 ith 是 1 而不是 2。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    因为它返回的是lag(ith),它始终为 1(或开头为 NA)。

    我会使用diffcumsum

    dat %>% group_by(id) %>% mutate(ith = cumsum(c(1,diff(obsvn)>=14)))
    Source: local data frame [7 x 3]
    Groups: id
    
      id obsvn ith
    1  A     1   1
    2  A     2   1
    3  A    29   2
    4  A    30   2
    5  A    45   3
    6  B     1   1
    7  B    15   2
    

    【讨论】:

    • 我知道这是一篇旧帖子,但谢谢你——这正是我所需要的。我不完全理解 c(1, diff()) 部分,你能详细说明一下吗?我以前从未见过像这样的cumsum。
    • @Knachman 因为diff 返回数字之间的差异,所以你总是得到一个比原始向量短一的向量。所以你结合一个起始数字。
    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 2016-09-14
    相关资源
    最近更新 更多