我想通过抽象最大日期减去最小日期来找出一个唯一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))