gpt4 book ai didi

r - 将具有连续日期的行合并为具有开始日期和结束日期的单行

转载 作者:行者123 更新时间:2023-12-04 11:56:49 25 4
gpt4 key购买 nike

我有一个看起来像这样的事件数据框:

EVENT     DATE       LONG    LAT    TYPE     
1 1/1/2000 23 45 A
2 2/1/2000 23 45 B
3 3/1/2000 23 45 B
3 5/2/2000 22 56 A
4 6/2/2000 19 21 A

我想折叠它,以便将连续几天在同一位置(由 LONG、LAT 定义)发生的任何事件折叠成一个事件,其中包含 START 和 END 日期以及 TYPES 的串联列参与。

因此上表将变为:

EVENT     START-DATE    END-DATE    LONG    LAT    TYPE     
1 1/1/2000 3/1/2000 23 45 ABB
2 5/2/2000 5/2/2000 22 56 A
3 6/2/2000 6/2/2000 19 21 A

任何关于如何最好地解决这个问题的建议将不胜感激。

最佳答案

这是 Ronak Shah 解决方案的修改版本,将同一位置的非连续事件作为单独的事件周期。

# expanded data sample
df <- data.frame(
DATE = as.Date(c("2000-01-01", "2000-01-02", "2000-01-03", "2000-01-05",
"2000-02-05", "2000-02-06", "2000-02-07"), format = "%Y-%m-%d"),
LONG = c(23, 23, 23, 23, 22, 19, 22),
LAT = c(45, 45, 45, 45, 56, 21, 56),
TYPE = c("A", "B", "B", "A", "A", "B", "A")
)

library(dplyr)

df %>%
group_by(LONG, LAT) %>%
arrange(DATE) %>%
mutate(DATE.diff = c(1, diff(DATE))) %>%
mutate(PERIOD = cumsum(DATE.diff != 1)) %>%
ungroup() %>%
group_by(LONG, LAT, PERIOD) %>%
summarise(START_DATE = min(DATE),
END_DATe = max(DATE),
TYPE = paste(TYPE, collapse = "")) %>%
ungroup()

# A tibble: 5 x 6
LONG LAT PERIOD START_DATE END_DATe TYPE
<dbl> <dbl> <int> <date> <date> <chr>
1 19 21 0 2000-02-06 2000-02-06 B
2 22 56 0 2000-02-05 2000-02-05 A
3 22 56 1 2000-02-07 2000-02-07 A
4 23 45 0 2000-01-01 2000-01-03 ABB
5 23 45 1 2000-01-05 2000-01-05 A

编辑以添加对“PERIOD”变量的解释。

为简单起见,让我们考虑在同一位置发生一些连续的连续和非连续事件,因此我们可以跳过 group_by(LONG, LAT)arrange(DATE) 步骤:

# sample dataset of 10 events at the same location. 
# first 3 are on consecutive days, next 2 are on consecutive days,
# next 4 are on consecutive days, & last 1 is on its own.
df2 <- data.frame(
DATE = as.Date(c("2001-01-01", "2001-01-02", "2001-01-03",
"2001-01-05", "2001-01-06",
"2001-02-01", "2001-02-02", "2001-02-03", "2001-02-04",
"2001-04-01"), format = "%Y-%m-%d"),
LONG = rep(23, 10),
LAT = rep(45, 10),
TYPE = LETTERS[1:10]
)

作为中间步骤,我们创建一些辅助变量:

  1. “DATE.diff”计算当前行日期与上一行日期之间的差异。由于第一行没有“2001-01-01”之前的日期,我们默认差为1。

  2. “non.consecutive”表示计算的日期差是不是1(即与前一天不连续),还是1(即与前一天连续)。如果您需要考虑数据集中同一位置的当天事件,您可以将计算从 DATE.diff != 1 更改为 DATE.diff > 1在这里。

  3. “PERIOD”跟踪“non.consecutive”变量中 TRUE 结果的数量。从第一行开始,每与上一行不连续,“PERIOD”就加1。

作为辅助变量的结果,“PERIOD”对于每组连续日期采用不同的值。

df2.intermediate <- df2 %>%
mutate(DATE.diff = c(1, diff(DATE))) %>%
mutate(non.consecutive = DATE.diff != 1) %>%
mutate(PERIOD = cumsum(non.consecutive))

> df2.intermediate
DATE LONG LAT TYPE DATE.diff non.consecutive PERIOD
1 2001-01-01 23 45 A 1 FALSE 0
2 2001-01-02 23 45 B 1 FALSE 0
3 2001-01-03 23 45 C 1 FALSE 0
4 2001-01-05 23 45 D 2 TRUE 1
5 2001-01-06 23 45 E 1 FALSE 1
6 2001-02-01 23 45 F 26 TRUE 2
7 2001-02-02 23 45 G 1 FALSE 2
8 2001-02-03 23 45 H 1 FALSE 2
9 2001-02-04 23 45 I 1 FALSE 2
10 2001-04-01 23 45 J 56 TRUE 3

然后我们可以将“PERIOD”视为一个分组变量,以便找到每个时期内的开始/结束日期和事件:

df2.intermediate %>%
group_by(PERIOD) %>%
summarise(START_DATE = min(DATE),
END_DATe = max(DATE),
TYPE = paste(TYPE, collapse = "")) %>%
ungroup()

# A tibble: 4 x 4
PERIOD START_DATE END_DATe TYPE
<int> <date> <date> <chr>
1 0 2001-01-01 2001-01-03 ABC
2 1 2001-01-05 2001-01-06 DE
3 2 2001-02-01 2001-02-04 FGHI
4 3 2001-04-01 2001-04-01 J

关于r - 将具有连续日期的行合并为具有开始日期和结束日期的单行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45993458/

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