聚合在R中的非数据帧对象上运行的函数

时间:2016-02-07 09:54:35

标签: r gps aggregate-functions geospatial centroid

我有一个简单的问题。 R中的aggregate()函数根据指定的条件在数据帧上运行。

聚合(my.data.frame,列表(所需列),要应用的功能)是默认用法。

计算简单函数(如数据框的列特定值的均值和中值)非常有用。但是,我所拥有的功能是不对数据帧进行操作,但我需要在特定列上执行此功能后聚合我的数据帧。让我展示数据集:

GPS Dataset

所以我需要为每个BSSID计算经度和纬度点的质心,我需要以这种方式聚合它。我在各种软件包中在线找到的函数计算了值矩阵的质心,而不是数据框,而aggregate()不能处理非数据框。

非常感谢提前:)

2 个答案:

答案 0 :(得分:0)

我喜欢dplyr - 语法对我来说很好。

my.data.frame %>% 
    group_by(bssid) %>% 
    summarise(centroidlon = myfunction(lon, lat)[1], 
              centroidlat = myfunction(lon, lat)[2])

如果myfunction速度很快,那么这将有效,但如果速度很慢,您可能需要重做它,以便每次bssid只调用一次该函数。

编辑以显示没有%>%运算符的替代方法

grouped.data.frame = group_by(my.data.frame, bssid)
summarised.data.frame = summarise(grouped.data.frame,
                                  centroidlon = myfunction(lon, lat)[1],
                                  centroidlat = myfunction(lon, lat)[2])

%>%运算符在左侧,并将其作为第一个参数传递到右侧。将语句链接在一起而不会被数百个嵌套括号弄糊涂是很有用的。在我看来,这使得阅读更容易。

答案 1 :(得分:0)

Aggregate适用于矩阵(而不仅仅是数据帧)。 这是一个可重现的问题示例,使用矩阵而不是数据框:

my_matrix <- matrix(c(100,100,200,200,11,22,33,44,-1,-2,3,-4),
                nrow=4,ncol=3,
                dimnames=list(c(1,2,3,4),c('BSSID','lat','long')))

> my_matrix

   BSSID lat long
1   100  11   -1
2   100  22   -2
3   200  33   -3
4   200  44   -4

> aggregate(cbind(lat,long)~BSSID,my_matrix,mean)

   BSSID  lat long
1   100  16.5 -1.5
2   200  38.5 -3.5

因此,这将是每个BSSID的纬度和经度的平均值(或质心)。 cbind函数(列绑定)允许您选择要聚合的多个变量,类似于Excel数据透视表。

如果仍有疑问,您可以使用as.data.frame()函数将矩阵转换为数据帧,并在需要时使用as.matrix()还原为矩阵。