簡體   English   中英

如何基於R中的重疊行匯總數據

[英]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的模式與樣本數據中的模式不同時,能夠復制結果對我來說也很重要。 謝謝!

這是使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM