【问题标题】:How do restructure the trip data to prepare a link data using spread and gather functions in R?如何使用 R 中的传播和收集函数重组行程数据以准备链接数据?
【发布时间】:2020-05-06 13:47:59
【问题描述】:

我有一个行程数据集如下:

df <- data.frame(user =c("P001", "P001", "P002"), tripID = c("tid1", "tid2", "tid3"), mode =c("bus", "train", "taxi"), Origin = c("Westmead", "Redfan", "Westmead"), Destination = c("Redfan", "Darlington", "Strathfield"), depart_dt = c("8:00", "8:30", "8:45") )

我需要使用来自 tidyr 的可能的 spread() 和 gather() 函数来重构上述数据,以准备如下链接行程数据:

df_new <- data.frame(user=c("P001", "P002"), tripID = c("newtid1", "newtid2"), mode = c("bus + train", "taxi"), Origin = c("Westmead", "Westmead" ), Destination = c("Darlington", "Strathfield"), depart_dt = c("8:00", "8:45"))

我是 R 中的一只新蜜蜂。有人可以在这里帮助我吗?

非常感谢。

【问题讨论】:

  • 感谢@Nirbhay Singh 提出改进查询语句的建议。
  • 很高兴为您提供帮助。可以参考this参考。

标签: r tidyr spread


【解决方案1】:

您不需要使用spread()gather()(或它们的继任者pivot_longer.pivot_wider()。 下面应该给你你想要的。

library(tidyverse)

df %>% 
  group_by(user) %>% 
  arrange(tripID, .by_group = TRUE) %>% 
  summarise(mode = str_c(mode, collapse = " + "),
            Origin = first(Origin),
            Destination = last(Destination),
            depart_dt = first(depart_dt)) %>% 
  mutate(tripID = str_c("newtrid", row_number()))

#   user  mode        Origin   Destination depart_dt tripID  
#   <fct> <chr>       <fct>    <fct>       <fct>     <chr>   
# 1 P001  bus + train Westmead Darlington  8:00      newtrid1
# 2 P002  taxi        Westmead Strathfield 8:45      newtrid2

【讨论】:

  • 不错的答案,+1。我喜欢使用firstlast,绝对看起来比索引更干净。
  • 我同意你的看法。但是我可以在这里使用 spread() 和 gather() 函数从给定的数据中得到相同的答案吗?
  • 但是,如果我们在 5 个月的时间里有 100 名用户从不同的起点到不同的目的地的超过 1000 次旅行,在这种情况下,上述解决方案无法帮助我重组给定的行程段数据为个人用户构建完整的旅程数据。任何人都可以帮助这个观点吗?
  • 为什么这对您没有帮助?你能解释一下出了什么问题吗?
【解决方案2】:

使用 dplyr:

library(dplyr)

df <- data.frame(user =c("P001", "P001", "P002"), tripID = c("tid1", "tid2", "tid3"), mode =c("bus", "train", "taxi"), Origin = c("Westmead", "Redfan", "Westmead"), Destination = c("Redfan", "Darlington", "Strathfield"), depart_dt = c("8:00", "8:30", "8:45") )

df %>%
  group_by(user) %>%
  arrange(depart_dt, .by_group = TRUE) %>%
  summarize(Origin = Origin[1], mode = paste(mode, collapse = " + "),
            Destination = Destination[length(Destination)],
            depart_dt = depart_dt[1]) %>%
  mutate(tripID = paste0("newtid", row_number()))
#> # A tibble: 2 x 6
#>   user  Origin   mode        Destination depart_dt tripID 
#>   <fct> <fct>    <chr>       <fct>       <fct>     <chr>  
#> 1 P001  Westmead bus + train Darlington  8:00      newtid1
#> 2 P002  Westmead taxi        Strathfield 8:45      newtid2

reprex package (v0.3.0) 于 2020 年 5 月 6 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    相关资源
    最近更新 更多