如何根据R

时间:2017-07-02 22:41:35

标签: r dplyr concatenation subset aggregation

我发布此问题是对我之前问题的延伸 - 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模式与示例数据中的模式不同时,能够复制结果对我来说很重要。谢谢!

1 个答案:

答案 0 :(得分: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

时重复行

完成此步骤后,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)

步骤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)