如何根据 R 中的重叠行汇总数据

How to summarize data based on overlapping rows in R

我发布这个问题作为我之前问题的扩展--。@ycw 帮助解决了之前的问题。但是,我还有一些问题需要解决。 我需要汇总以下数据(此数据是我上一个问题中解决方案部分的数据,并带有一个附加列)。

MoveID  Travel_Time Person  Day.ID  Place   Location_Code   Conc_Code   Mode
NA          NA      5       1       0       H                   1       NA
0           0.5     5       1       1       C                   0       D
1           0.5     5       1       2       D                   0       D
2           0.5     5       1       3       W                   1       D
3           1       5       1       4       E                   0       T
4           1       5       1       5       W                   1       T
5           0.25    5       1       6       H                   1       D
6           0.5     5       1       7       F                   0       P
7           1       5       1       8       H                   1       P

我想按以下方式总结基于 Conc_Code 的数据:对数据进行子集化,从第一个 1 开始到第二个 1-添加该子集的行程时间并连接模式(将第一个单元格留在子集)。然后将数据从第二个 1 到第三个 1 进行子集化——将旅行时间中的所有单元格添加到子集中,并连接同一子集中模式的单元格,留下子集中的第一个单元格,第三个子集以此类推。我要查找的最终数据如下所示:

Person      Day     Journey Type        Mode/s  Travel Time(hr)
5           1       H-C-D-W             DDD     1.5
5           1       W-E-W               TT      2
5           1       W-H                 D       0.25
5           1       H-F-H               PP      1.5

如果有人可以帮助我正确编码以获取结果,我将不胜感激。此外,当 Conc_Code 中 1 和 0 的模式与示例数据中的模式不同时,能够复制结果对我来说很重要。谢谢!

这是使用 tidyversedata.table 的解决方案。 dt5 是最终输出。

# Load packages
library(tidyverse)
library(data.table)

# Create example data frame
dt <- read.table(text = "MoveID  Travel_Time Person  Day.ID  Place   Location_Code   Conc_Code   Mode
NA          NA      5       1       0       H                   1       NA
0           0.5     5       1       1       C                   0       D
1           0.5     5       1       2       D                   0       D
2           0.5     5       1       3       W                   1       D
3           1       5       1       4       E                   0       T
4           1       5       1       5       W                   1       T
5           0.25    5       1       6       H                   1       D
6           0.5     5       1       7       F                   0       P
7           1       5       1       8       H                   1       P",
                 header = TRUE, stringsAsFactors = FALSE)

第 1 步:当 Conc_Code == 1

时复制行

这一步之后,Con_Code3中的2表示开始,而1表示结束。

dt2 <- dt %>%
  mutate(Conc_Code2 = ifelse(Conc_Code == 1, 2, 0)) %>%
  mutate(Conc_Code3 = map2(Conc_Code, Conc_Code2, `:`)) %>%
  unnest() %>%
  select(-Conc_Code, -Conc_Code2)

第 2 步:创建 运行 长度 ID 以识别事件

Run2表示事件ID

dt3 <- dt2 %>%
  mutate(Conc_Code4 = ifelse(Conc_Code3 == 0, 2, Conc_Code3)) %>%
  mutate(Run1 = rleid(Conc_Code4)) %>%
  mutate(Run2 = ifelse(Run1 %% 2 == 1, Run1 - 1, Run1))

第 3 步:根据事件 ID 汇总数据

dt4 <- dt3 %>%
  group_by(Person, Day.ID, Run2) %>%
  summarise(`Journey Type` = paste(Location_Code, collapse = "-"),
            `Mode/s` = paste(Mode[2:n()], collapse = ""),
            `Travel Time(hr)` = sum(Travel_Time[2:n()])) %>%
  ungroup()

第 4 步:删除第一行和最后一行,最终处理

dt5 <- dt4 %>%
  group_by(Person, Day.ID) %>%
  slice(2:(n() - 1)) %>%
  select(-Run2) %>%
  rename(Day = Day.ID)