使用哪个apply函数可以在分组数据帧上循环聚类函数?

时间:2017-11-15 15:24:37

标签: r apply plyr

我有一个包含车辆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)

是否有执行此类操作的功能?它会是什么?

2 个答案:

答案 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, ...))