类似于分组数据的条件seq_along

时间:2015-06-09 15:10:23

标签: r dplyr

我正在尝试生成观察的“情节”,将观察结果组合在一起struct eOfficeExtensions{ const CString WORD_EXTENSION; const CString EXCEL_EXTENSION; const CString WORDPAD_EXTENSION; const INT EXTENSION2007; }; const eOfficeExtensions extensions2003{_T(".doc"), _T(".xls"), _T(".rtf"), 0}; const eOfficeExtensions extensions2007{_T(".docx"), _T(".xlsx"), _T(".rtf"), 1}; const eOfficeExtensions* extensions = 0; // ... Later ... if (office2007Installed) extensions = &extensions2007; else extensions = &extensions2003; 相隔14天。 有了dplyr,我设法计算了自上次观察以来的天数。但是,我无法弄清楚如何在没有</=循环的情况下根据条件</= 14获取新ID。

示例数据:

for

#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

这不是我想要的。我不明白为什么第4行中的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 是1而不是2.

1 个答案:

答案 0 :(得分:6)

因为它返回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