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

  • 本文关键字:计算 唯一 ID r date group-by
  • 更新时间 :
  • 英文 :


我想通过抽象最大日期减去最小日期来找出一个唯一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()一个新列添加到现有表中。让我们暂时忘记团体,假设以下日期:

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)) 

相关内容

  • 没有找到相关文章

最新更新