我发布此问题是对我之前问题的延伸 - How to subset data based on predefined pattern 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模式与示例数据中的模式不同时,能够复制结果对我来说很重要。谢谢!
答案 0 :(得分: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)
完成此步骤后,2
中的Con_Code3
表示开始,而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)
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))
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()
dt5 <- dt4 %>%
group_by(Person, Day.ID) %>%
slice(2:(n() - 1)) %>%
select(-Run2) %>%
rename(Day = Day.ID)