按唯一 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))
我想通过提取最大日期减去最小日期来查找唯一 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))