R中是否有一种方法可以按“行程”分组?

时间:2019-12-25 00:19:29

标签: r

说我有

df<-data.frame(group=c(1, 1, 1, 1, 2, 2, 2, 2), 
               date=c("2000-01-01", "2000-01-02", "2000-01-04", "2000-01-05", "2000-01-09", "2000-01-10", "2000-01-11", "2000-01-13"),
               want_group=c(1, 1, 2, 2, 3,3,3,4))

我想创建一个want_group变量,该变量按日期,分组以及是否为“每日”分组。因此,例如,我想为组1中的第1个和第2个创建唯一ID,然后为第4个和第5个创建一个新的唯一ID,然后为组2创建第9个,第10个和第11个类似的新ID。

  group       date want_group
1     1 2000-01-01          1
2     1 2000-01-02          1
3     1 2000-01-04          2
4     1 2000-01-05          2
5     2 2000-01-09          3
6     2 2000-01-10          3
7     2 2000-01-11          3
8     2 2000-01-13          4

谢谢

2 个答案:

答案 0 :(得分:3)

我们可以使用diffcumsum来计算行程。每当date的差大于1时,此值就会增加。

df$new <- cumsum(c(TRUE, diff(as.Date(df$date)) > 1))
df

#  group       date want_group new
#1     1 2000-01-01          1   1
#2     1 2000-01-02          1   1
#3     1 2000-01-04          2   2
#4     1 2000-01-05          2   2
#5     2 2000-01-09          3   3
#6     2 2000-01-10          3   3
#7     2 2000-01-11          3   3
#8     2 2000-01-13          4   4

由于TRUE返回的输出长度比原始向量小1,因此我们在开头添加了diff


要按组处理此问题,我们可以做

library(dplyr)

df %>%
  mutate(date = as.Date(date)) %>%
  group_by(group) %>%
  mutate(new = c(TRUE, diff(date) > 1)) %>%
  ungroup() %>%
  mutate(new = cumsum(new))

答案 1 :(得分:0)

借助const value = /^\d+(?:\.\d+)?$/.test(givenValue) ? Number(givenValue) : givenValue; // ^^^^^^^^^^ ,我们也可以做到

base R

或与df$date <- as.Date(df$date) df$new <- with(df, cumsum(c(TRUE, date[-1]- date[-length(date)] > 1))) df$new #[1] 1 1 2 2 3 3 3 4 中的lag使用差异

dplyr