在 R 中使用 for 循环优化子集
Optimising subsetting with for loop in R
我正在使用 R 和 RStudio 来分析 GTFS public 传输源并使用 ggplot2 创建时间表范围图。该代码目前工作正常但速度很慢,这在处理非常大的 CSV 时会出现问题,这里经常出现这种情况。
代码中最慢的部分如下(有一些上下文):循环遍历数据框并将每个唯一行程的子集放入一个临时数据框,极端到达和离开值(第一个 &最后一行)被提取:
# Creates an empty df to contain trip_id, trip start and trip end times
Trip_Times <- data.frame(Trip_ID = character(), Departure = character(), Arrival = character(), stringsAsFactors = FALSE)
# Creates a vector containing all trips of the analysed day
unique_trips = unique(stop_times$trip_id)
# Iterates through stop_times for each unique trip_id and populates previously created data frame
for (i in seq(from = 1, to = length(unique_trips), by = 1)) {
temp_df <- subset(stop_times, trip_id == unique_trips[i])
Trip_Times[nrow(Trip_Times) + 1, ] <- c(temp_df$trip_id[[1]], temp_df$departure_time[[1]], temp_df$arrival_time[[nrow(temp_df)]])
}
stop_times
df 看起来如下,一些包含超过 250 万行的提要提供了大约 20 万次独特的旅行,因此有 20 万次循环迭代...
head(stop_times)
trip_id arrival_time departure_time stop_sequence
1 011_0840101_A14 7:15:00 7:15:00 1
2 011_0840101_A14 7:16:00 7:16:00 2
3 011_0840101_A14 7:17:00 7:17:00 3
4 011_0840101_A14 7:18:00 7:18:00 4
5 011_0840101_A14 7:19:00 7:19:00 5
6 011_0840101_A14 7:20:00 7:20:00 6
谁能告诉我如何优化这段代码以获得更快的结果。我不相信 apply
可以在这里使用,但我很可能是错的。
这应该很简单 dplyr
...
library(dplyr)
Trip_Times <- stop_times %>%
group_by(trip_id) %>%
summarise(departure_time=first(departure_time),
arrival_time=last(arrival_time))
我们可以使用data.table
library(data.table)
setDT(stop_times)[, .(departure_time = departure_time[1L],
arrival_time = arrival_time[.N]) , by = trip_id]
我正在使用 R 和 RStudio 来分析 GTFS public 传输源并使用 ggplot2 创建时间表范围图。该代码目前工作正常但速度很慢,这在处理非常大的 CSV 时会出现问题,这里经常出现这种情况。
代码中最慢的部分如下(有一些上下文):循环遍历数据框并将每个唯一行程的子集放入一个临时数据框,极端到达和离开值(第一个 &最后一行)被提取:
# Creates an empty df to contain trip_id, trip start and trip end times
Trip_Times <- data.frame(Trip_ID = character(), Departure = character(), Arrival = character(), stringsAsFactors = FALSE)
# Creates a vector containing all trips of the analysed day
unique_trips = unique(stop_times$trip_id)
# Iterates through stop_times for each unique trip_id and populates previously created data frame
for (i in seq(from = 1, to = length(unique_trips), by = 1)) {
temp_df <- subset(stop_times, trip_id == unique_trips[i])
Trip_Times[nrow(Trip_Times) + 1, ] <- c(temp_df$trip_id[[1]], temp_df$departure_time[[1]], temp_df$arrival_time[[nrow(temp_df)]])
}
stop_times
df 看起来如下,一些包含超过 250 万行的提要提供了大约 20 万次独特的旅行,因此有 20 万次循环迭代...
head(stop_times)
trip_id arrival_time departure_time stop_sequence
1 011_0840101_A14 7:15:00 7:15:00 1
2 011_0840101_A14 7:16:00 7:16:00 2
3 011_0840101_A14 7:17:00 7:17:00 3
4 011_0840101_A14 7:18:00 7:18:00 4
5 011_0840101_A14 7:19:00 7:19:00 5
6 011_0840101_A14 7:20:00 7:20:00 6
谁能告诉我如何优化这段代码以获得更快的结果。我不相信 apply
可以在这里使用,但我很可能是错的。
这应该很简单 dplyr
...
library(dplyr)
Trip_Times <- stop_times %>%
group_by(trip_id) %>%
summarise(departure_time=first(departure_time),
arrival_time=last(arrival_time))
我们可以使用data.table
library(data.table)
setDT(stop_times)[, .(departure_time = departure_time[1L],
arrival_time = arrival_time[.N]) , by = trip_id]