在 R 中对大型数据集的行进行分组
Grouping rows of large dataset in R
我正在尝试使用 GPS 数据计算驾驶员 activity。我编写了一个循环,用于计算数据帧中两个连续点之间在值范围内的时间差,并对其求和。
这是我的数据示例:
DriveNo Date.and.Time Latitude Longitude
1 156 2014-01-31 23:00:00 41.88367 12.48778
2 187 2014-01-31 23:00:01 41.92854 12.46904
3 297 2014-01-31 23:00:01 41.89107 12.49270
4 89 2014-01-31 23:00:01 41.79318 12.43212
5 79 2014-01-31 23:00:01 41.90028 12.46275
6 191 2014-01-31 23:00:02 41.85231 12.57741
代表:
taxi_noOutlier <- structure(list(DriveNo = c(156, 187, 297, 89, 79, 191),
Date.and.Time = structure(c(1391209200.73917, 1391209201.14846,
1391209201.22007, 1391209201.47085, 1391209201.63114, 1391209202.04855),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
Latitude = c(41.883670807, 41.928543091, 41.891067505, 41.793178558,
41.900276184, 41.852306366),
Longitude = c(12.48777771, 12.469037056, 12.492704391, 12.432122231,
12.46274662, 12.577406883)),
row.names = c(NA, 6L), class = "data.frame")
循环:
taxi_156 <- filter(taxi_noOutlier, DriveNo == 156)
datelist = taxi_156$Date.and.Time
dlstandard = as.POSIXlt(datelist)
diffsum <- as.numeric(sum(Filter(function(x) x <= 60, difftime(tail(dlstandard, -1), head(dlstandard, -1), units = 'secs'))))
print(paste("The total activity time for driver #156 is ", diffsum))
输出为:
[1] "The total activity time for driver #264 is 705655.37272048"
我的问题是,如何扩展此代码以找到每个其他驱动程序的 activity? (有 374 个独特的驱动程序,每个都有数千个点。)我试图使用一个循环来复制上面的代码,该循环会计算每个 DriveNo 的时间差,但我是 R 的新手,我对循环语法的理解是'太好了。
我可以使用这样的方法过滤成单独的数据帧吗? (这给出了与意外包围有关的错误)。
for (i in seq_along(taxi_noOutlier$DriveNo))
{
taxi_[[i]] <- filter(taxi_noOutlier, DriveNo == [[i]])
}
然后在每一个上都使用我的原始代码?或者有没有更有效的方法?谢谢
这是您需要的吗?
单独的数据帧存储在列表 taxi.list
.
中
taxi.list <- list()
for (i in taxi_noOutlier$DriveNo){
name <- paste0("taxi_",i)
taxi.list[[name]] <- filter(taxi_noOutlier, DriveNo == i)
#same as
#taxi.list[[name]] <- taxi_noOutlier %>% filter(DriveNo == i)
}
您可以 group_by
每个 DriveNo
得到连续 Date.and.Time
之间的差异,删除小于一分钟的值和 sum
差异。
library(dplyr)
taxi_noOutlier %>%
group_by(DriveNo) %>%
mutate(difftime = difftime(Date.and.Time, lag(Date.and.Time), units = 'secs')) %>%
filter(difftime <= 60) %>%
summarise(diffsum = sum(as.numeric(difftime), na.rm = TRUE)) -> result
result
我正在尝试使用 GPS 数据计算驾驶员 activity。我编写了一个循环,用于计算数据帧中两个连续点之间在值范围内的时间差,并对其求和。
这是我的数据示例:
DriveNo Date.and.Time Latitude Longitude
1 156 2014-01-31 23:00:00 41.88367 12.48778
2 187 2014-01-31 23:00:01 41.92854 12.46904
3 297 2014-01-31 23:00:01 41.89107 12.49270
4 89 2014-01-31 23:00:01 41.79318 12.43212
5 79 2014-01-31 23:00:01 41.90028 12.46275
6 191 2014-01-31 23:00:02 41.85231 12.57741
代表:
taxi_noOutlier <- structure(list(DriveNo = c(156, 187, 297, 89, 79, 191),
Date.and.Time = structure(c(1391209200.73917, 1391209201.14846,
1391209201.22007, 1391209201.47085, 1391209201.63114, 1391209202.04855),
class = c("POSIXct", "POSIXt"), tzone = "UTC"),
Latitude = c(41.883670807, 41.928543091, 41.891067505, 41.793178558,
41.900276184, 41.852306366),
Longitude = c(12.48777771, 12.469037056, 12.492704391, 12.432122231,
12.46274662, 12.577406883)),
row.names = c(NA, 6L), class = "data.frame")
循环:
taxi_156 <- filter(taxi_noOutlier, DriveNo == 156)
datelist = taxi_156$Date.and.Time
dlstandard = as.POSIXlt(datelist)
diffsum <- as.numeric(sum(Filter(function(x) x <= 60, difftime(tail(dlstandard, -1), head(dlstandard, -1), units = 'secs'))))
print(paste("The total activity time for driver #156 is ", diffsum))
输出为:
[1] "The total activity time for driver #264 is 705655.37272048"
我的问题是,如何扩展此代码以找到每个其他驱动程序的 activity? (有 374 个独特的驱动程序,每个都有数千个点。)我试图使用一个循环来复制上面的代码,该循环会计算每个 DriveNo 的时间差,但我是 R 的新手,我对循环语法的理解是'太好了。
我可以使用这样的方法过滤成单独的数据帧吗? (这给出了与意外包围有关的错误)。
for (i in seq_along(taxi_noOutlier$DriveNo))
{
taxi_[[i]] <- filter(taxi_noOutlier, DriveNo == [[i]])
}
然后在每一个上都使用我的原始代码?或者有没有更有效的方法?谢谢
这是您需要的吗?
单独的数据帧存储在列表 taxi.list
.
taxi.list <- list()
for (i in taxi_noOutlier$DriveNo){
name <- paste0("taxi_",i)
taxi.list[[name]] <- filter(taxi_noOutlier, DriveNo == i)
#same as
#taxi.list[[name]] <- taxi_noOutlier %>% filter(DriveNo == i)
}
您可以 group_by
每个 DriveNo
得到连续 Date.and.Time
之间的差异,删除小于一分钟的值和 sum
差异。
library(dplyr)
taxi_noOutlier %>%
group_by(DriveNo) %>%
mutate(difftime = difftime(Date.and.Time, lag(Date.and.Time), units = 'secs')) %>%
filter(difftime <= 60) %>%
summarise(diffsum = sum(as.numeric(difftime), na.rm = TRUE)) -> result
result