我有一个包含车辆预计到达时间的数据框。数据包含一次(实际(到达的许多 ETA,我想将应对应于一次到达的 ETA 分组在一起。
我的数据看起来像这样,cluster
是我想要的结果:
vehicle eta ... cluster
--------- ------------ ----- ---------
car_1 01-11-2017 ... 1
car_1 02-11-2017 ... 1
car_1 15-11-2017 ... 2
horse_3 05-11-2017 ... 1
horse_3 12-11-2017 ... 2
horse_3 13-11-2017 ... 2
我编写了一个执行此聚类分析的自定义函数。该函数的输入是一辆车的行,它返回一个带有集群索引的数组。例如,如果我将示例数据的第 1-3 行传递给它,它将输出c(1,1,2)
.所以现在我需要做的就是循环数据集中的所有车辆并应用该功能,但这就是我卡住的地方。
使用 cluster_etas
作为我的自定义聚类函数,我知道我可以这样做:
# Initialize an empty column
data$cluster <- 0
# Loop over all vehicles and perform clustering
for (i in unique(data$vehicle)) {
filter_vector <- data$vehicle == i
data$cluster[filter_vector] <- cluster_etas(data[filter_vector,])
}
但我怀疑有一个更智能的解决方案看起来像这样,用一种apply
的函数填补空白:
data$cluster <- _____(data = data, by = vehicle, function = cluster_etas)
是否有执行此类操作的函数?会是什么?
tapply
:
-用于对向量的子集应用函数
str(tapply)
#function (X, INDEX, FUN = NULL, ..., simplify = TRUE)
解释论点:
X
是向量
INDEX
是一个因素或一系列因素(或对因素具有强制力的东西(
FUN
是要应用的
函数 ...
包含要传递的其他参数 FUN
因此,我认为解决方案应该是这样的tapply(data$eta, data$vehicle, FUN = ..你的功能..(
我已经找到了使用plyr
包中的ddply
函数解决问题的有效解决方案。它确实需要我更改我的自定义函数 - 以前,自定义函数会将数据框作为其参数并提取所需的列,现在它直接将这些列作为参数(无论如何,这都是更通用的解决方案(。
data <- plyr::ddply(data, "vehicle", transform,
cluster = cluster_etas(eta, travel_time, ...))