[英]How to summarize data based on overlapping rows in R
我將此問題發布為對上一個問題的擴展- 如何基於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-add移動時間並串聯模式(將第一個單元格留在子集中)。 然后將數據從第二個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)
在此步驟之后, 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)
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.