如何根据 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 的模式与示例数据中的模式不同时,能够复制结果对我来说很重要。谢谢!
这是使用 tidyverse
和 data.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)
我发布这个问题作为我之前问题的扩展--
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 的模式与示例数据中的模式不同时,能够复制结果对我来说很重要。谢谢!
这是使用 tidyverse
和 data.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)