在 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