[英]transpose grouped rows into from-to columns in r
我有一個數據集,我想將這些分組的行轉換為列並計算距離。
假設我有一個如下所示的數據集,其中“訂單”列僅在組內相關,並且有多種 mod,一組僅使用一個 mod。 當然 dataframe 有更多的組行。
第 1 組 | 命令 | Area_id | 開始日期 | 結束日期 | 模組 | 區域名稱 | 緯度 | 長 |
---|---|---|---|---|---|---|---|---|
一個 | 1 | 0001 | 2022-01-01 | 2022-01-02 | trk | 加利福尼亞 | 36.778261 | -119.4179324 |
一個 | 2 | 0002 | 2022-01-04 | 2022-01-07 | trk | 加利福尼 | 36.778262 | -119.4179325 |
一個 | 3 | 0003 | 2022-01-10 | 2022-01-12 | trk | 加州 | 36.778264 | -119.4179329 |
一個 | 4 | 0004 | 2022-01-16 | 2022-01-20 | trk | 加州 | 36.778265 | -119.4179330 |
乙 | 1 | 0012 | 2022-02-11 | 2022-02-12 | 公共汽車 | 巴塞羅那 | 41.385063 | 2.1734036 |
乙 | 2 | 0013 | 2022-02-14 | 2022-02-18 | 公共汽車 | 巴塞羅那b | 41.385064 | 2.1734037 |
C | 1 | 0020 | 2022-01-27 | 2022-01-29 | 車 | 奧克蘭 | 37.8043237 | -122.2711133 |
C | 2 | 0012 | 2022-02-02 | 2022-02-04 | 車 | 巴塞羅那 | 41.385063 | 2.1734036 |
C | 3 | 0009 | 2022-02-07 | 2022-02-10 | 車 | 奧克蘭 | 37.8043637 | -122.2711237 |
...我想像下面這樣轉換這些 dataframe。 其中“距離”列是“From_area”和“To_area”之間的距離。 能否請你幫忙?
團體 | From_area_id | To_area_id | From_area | To_area | 開始日期 | 結束日期 | 模組 | 距離 |
---|---|---|---|---|---|---|---|---|
一個 | 0001 | 0002 | 加利福尼亞 | 加利福尼 | 2022-01-02 | 2022-01-04 | trk | |
一個 | 0002 | 0003 | 加利福尼 | 加州 | 2022-01-07 | 2022-01-10 | trk | |
一個 | 0003 | 0004 | 加州 | 加州 | 2022-01-12 | 2022-01-16 | trk | |
乙 | 0012 | 0013 | 巴塞羅那 | 巴塞羅那b | 2022-02-12 | 2022-02-14 | 公共汽車 | |
C | 0020 | 0012 | 奧克蘭 | 巴塞羅那 | 2022-01-29 | 2022-02-02 | 車 | |
C | 0012 | 0009 | 巴塞羅那 | 奧克蘭 | 2022-02-04 | 2022-02-07 | 車 |
像這樣的東西:
library(dplyr)
library(geosphere)
df %>%
group_by(Group1) %>%
mutate(Area_id = str_pad(as.character(Area_id), 4, pad="0")) %>%
mutate(To_area_id = lead(Area_id), .after="Area_id") %>%
mutate(To_area = lead(Area_name), .after="Area_name") %>%
mutate(across(c(lat, long), ~lead(.), .names = "To_{.col}")) %>%
na.omit() %>%
rename(From_area_id = Area_id, From_area = Area_name, From_lat=lat, From_long = long) %>%
rowwise() %>%
mutate(Distance = distHaversine(c(From_long, From_lat),
c(To_long, To_lat)), .keep="unused")
Group1 order From_area_id To_area_id start_date end_date mod From_area To_area Distance
<chr> <int> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <dbl>
1 A 1 0001 0002 2022-01-01 2022-01-02 trk California Californib 0.112
2 A 2 0002 0003 2022-01-04 2022-01-07 trk Californib Californic 0.225
3 A 3 0003 0004 2022-01-10 2022-01-12 trk Californic Californid 0.112
4 B 1 0012 0013 2022-02-11 2022-02-12 bus Barcelona Barcelonb 0.112
5 C 1 0020 0012 2022-01-27 2022-01-29 car oaklanda Barcelona 9572260.
6 C 2 0012 0009 2022-02-02 2022-02-04 car Barcelona oaklandc 9572257.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.