gpt4 book ai didi

r - 在 R 中为连续行分组数据

转载 作者:行者123 更新时间:2023-12-03 16:06:28 24 4
gpt4 key购买 nike

如果在 R 中没有快速的 1-3 衬里,我肯定会使用 linux sort和一个使用 groupby 的简短 Python 程序,所以不要向后弯腰试图让一些疯狂的工作。这是输入数据框:

df_in <- data.frame(
ID = c(1,1,1,1,1,2,2,2,2,2),
weight = c(150,150,151,150,150,170,170,170,171,171),
start_day = c(1,4,7,10,11,5,10,15,20,25),
end_day = c(4,7,10,11,30,10,15,20,25,30)
)
ID weight start_day end_day
1 1 150 1 4
2 1 150 4 7
3 1 151 7 10
4 1 150 10 11
5 1 150 11 30
6 2 170 5 10
7 2 170 10 15
8 2 170 15 20
9 2 171 20 25
10 2 171 25 30

我想通过 ID 做一些基本的聚合和 weight ,但仅当组位于 df_in 的连续行中时.具体来说,期望的输出是
df_desired_out <- data.frame(
ID = c(1,1,1,2,2),
weight = c(150,151,150,170,171),
min_day = c(1,7,10,5,20),
max_day = c(7,10,30,20,30)
)
ID weight min_day max_day
1 1 150 1 7
2 1 151 7 10
3 1 150 10 30
4 2 170 5 20
5 2 171 20 30

这个 question似乎非常接近我想要的,但由于某种原因我在适应它时遇到了很多麻烦。

最佳答案

在 dplyr 中,我会通过为连续行创建另一个分组变量来做到这一点。这就是代码 cumsum(c(1, diff(weight) != 0)在下面的代码块中做。 here 也是一个例子。 .

群组创建可以在 group_by 内完成,然后您可以相应地按组进行任何摘要。

library(dplyr)

df_in %>%
group_by(ID, group_weight = cumsum(c(1, diff(weight) != 0)), weight) %>%
summarise(start_day = min(start_day), end_day = max(end_day))

Source: local data frame [5 x 5]
Groups: ID, group_weight [?]

ID group_weight weight start_day end_day
(dbl) (dbl) (dbl) (dbl) (dbl)
1 1 1 150 1 7
2 1 2 151 7 10
3 1 3 150 10 30
4 2 4 170 5 20
5 2 5 171 20 30

这种方法确实会在数据集中为您留下额外的分组变量,如果需要,可以使用 select(-group_weight) 将其删除。解码后。

关于r - 在 R 中为连续行分组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32529854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com