r语言 - 使用哪个应用函数,我可以在分组数据帧上循环聚类函数



我有一个包含车辆预计到达时间的数据框。数据包含一次(实际(到达的许多 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, ...))

最新更新