我有一个包含车辆ETA的数据框。这些数据包含许多(实际)到达的ETA,我想将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)
是否有执行此类操作的功能?它会是什么?
答案 0 :(得分:0)
tapply
:
- 用于在向量的子集上应用函数
str(tapply)
#function (X, INDEX, FUN = NULL, ..., simplify = TRUE)
解释论点:
X
是向量
INDEX
是一个因素或一系列因素(或某些因素可强制作用)
FUN
是要应用的功能
...
包含要传递的其他参数FUN
因此,我认为解决方案应该是这样的 tapply(数据$ eta,数据$ vehicle,FUN = ..你的函数..)
答案 1 :(得分:0)
我使用ddply
包中的plyr
函数找到了解决问题的有效方法。它确实需要我更改我的自定义函数 - 以前,自定义函数会将数据框作为其参数并提取所需的列,现在它将这些列直接作为参数(这使得无论如何都会提供更通用的解决方案)。
data <- plyr::ddply(data, "vehicle", transform,
cluster = cluster_etas(eta, travel_time, ...))