【问题标题】:How to group the similar row, and queries some row column in R?如何对相似的行进行分组,并查询 R 中的某些行列?
【发布时间】:2021-03-25 11:36:40
【问题描述】:

我是 R 语言的新手。我的问题是

  1. 我想管理具有多个 id 的起点-终点位置。 这是我的原始数据(csv 文件)的示例
vehicle_id location time
0111111111 13_100.27 13.58
0111111111 13_140.87 17.38
0222222222 12_445.78 02.15

附言。有许多vehicle_id数据,有些是相同的,有些是不同的。

  1. 我想将vehicle_id 分组,并像这样根据时间创建起点和终点位置;
vehicle_id location of origin start time location of destination finish time
0111111111 13_100.27 13.58 13_140.87 17.38
0222222222 13_140.87 17.38 13_102.99 23.57
0333333333 12_445.78 02.15 10.589.58 05.69

如何编写代码以获得上述结果?提前感谢您的帮助。

【问题讨论】:

  • 嗨!如果您提供数据集的小样本,读者可以直接使用它,您可能会更快地获得有用的答案。例如,尝试 dput(head, your_data_set, 10) 并将输出附加到您的问题中。

标签: r


【解决方案1】:

使用 SQL,我们可以将每次旅行的开始时间和位置提取到 start_data,类似地将结束时间和位置提取到 end_data,然后将它们连接起来。这利用了这样一个事实,即如果使用 min,SQLite 会自动选择最小化行上的位置,对于 max 也是如此。

library(sqldf)

sqldf("
 with start_data as (
   select vehicle_id, location start_location, min(time) start_time 
   from Trips 
   group by vehicle_id),
 end_data as (
   select vehicle_id, location end_location, max(time) end_time
   from Trips 
   group by vehicle_id)
 select * from start_data left join end_data using(vehicle_id)")

给予:

  vehicle_id start_location start_time end_location end_time
1  111111111      13_100.27      13.58    13_140.87    17.38
2  222222222      12_445.78       2.15    12_445.78     2.15

注意

可重现形式的输入。

Trips <- structure(list(vehicle_id = c(111111111L, 111111111L, 222222222L
), location = c("13_100.27", "13_140.87", "12_445.78"), time = c(13.58, 
17.38, 2.15)), class = "data.frame", row.names = c(NA, -3L))

【讨论】:

  • 感谢您的帮助,格洛腾迪克!但是,在我应用您的代码后,我的开始时间和结束时间很奇怪。现在已经不是时候了。比如开始时间的值是 36,结束时间是 86312 像这样,但是其余的结果是 sustisfied。
  • 问题中的数据需要以可重现的形式提供。由于那还没有完成,我在注释中为您完成了它,您可以从答案中的输出中看到它工作正常。请注意r 标记页面顶部的说明,该说明要求提供显示dput(X) 输出的数据,其中X 是您的输入被适当缩减。
  • 另请注意,此链接中的解决方案:stackoverflow.com/questions/66787354/… 可能适用。特别是使用 collapse 包的解决方案运行速度非常快。
【解决方案2】:

这行得通吗:

library(dplyr)
df %>% group_by(vehicle_id) %>% summarise('location origin' = location, 'start time' = time, 
                                           'location destination' = lead(location), 'finish time' = lead(time)) %>% na.omit()
`summarise()` regrouping output by 'vehicle_id' (override with `.groups` argument)
# A tibble: 2 x 5
# Groups:   vehicle_id [2]
  vehicle_id `location origin` `start time` `location destination` `finish time`
       <dbl> <chr>                    <dbl> <chr>                          <dbl>
1  111111111 13_100.27                13.6  13_140.87                       17.4
2  222222222 12_445.78                 2.15 13_102.99                       23.6

使用的数据:

df
# A tibble: 4 x 3
  vehicle_id location   time
       <dbl> <chr>     <dbl>
1  111111111 13_100.27 13.6 
2  111111111 13_140.87 17.4 
3  222222222 12_445.78  2.15
4  222222222 13_102.99 23.6 

【讨论】:

    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2021-11-25
    相关资源
    最近更新 更多