按唯一 ID 分组以计算 R 中的天数

Group by unique ids to calculate number of days in R

我想通过提取最大日期减去最小日期来查找唯一 ID 在这个 df 中工作了多少天。

structure(list(id = c("f1", "f2", "f2", "f4", "f5", "f2", "f3", 
"f1", "f1", "f3", "f4", "f2", "f2", "f2", "f2"), 
 date = structure(c(18687, 18687, 18687, 18687, 18687, 
18687, 18687, 18687, 18687, 18687, 18687, 18687, 18687, 18687, 
18687), class = "Date")), row.names = c(2L, 4L, 8L, 15L, 17L, 
18L, 21L, 25L, 36L, 37L, 38L, 40L, 42L, 48L, 52L), class = "data.frame")

我试过了,但我得到了奇怪的数字

df_total_days_per_id<-df %>%
  group_by(id) %>%
  mutate(xx1 = max(date)-min(date)) %>% #by user find range
  group_by(id) %>%
  summarise(number_of_days = sum(xx1)) 

根据你的代码,我可以估计你为什么会得到“奇怪的数字”。

函数 mutate() 向现有 table 添加了一个新列 。让我们暂时忘记团体并假设以下日期:

2022-01-01 
2022-01-11 
2022-01-21

你希望答案是 20,对吗? 21 减 1。然而,使用 mutate() 函数,您创建了这个:

2022-01-01   20 days
2022-01-11   20 days
2022-01-21   20 days

然后在最后一个操作中,您将所有这 20 天加起来达到 60 天。显然这是错误的。

我们不使用 mutate(),而是像这样使用 summarize()

df %>%
  group_by(id) %>%
  summarize(number_of_days = max(date)-min(date)+1) #added +1 for correction 

此后无需再添加 group_by()sum()

编辑:

我注意到你说的是工作天数。因此,如果我们采用上面的示例,您可能希望输出 3 而不是 20,因为中间有几天被跳过了。如果是这种情况,您应该在 summarize() 中完全使用不同的函数。

为此,我们可以使用函数 n_distinct() 计算一组中唯一值的数量,如下所示:

df %>%
  group_by(id) %>%
  summarise(number_of_days = n_distinct(date))