0

我有一个简单的问题。R 中的 aggregate() 函数根据指定的条件对数据帧进行操作。

aggregate(my.data.frame, list(desired column), function to be applied)是默认用法。

计算简单函数(例如数据框的列特定值的均值和中值)很有用。不过,我所拥有的是一个不对数据帧进行操作的函数,但是在对特定列执行此函数后,我需要聚合我的数据帧。让我显示数据集:

GPS 数据集

所以我需要计算每个 BSSID 的经度和纬度点的质心,我需要以这种方式聚合它。我从各种包中在线找到的函数计算值矩阵而不是数据帧的质心,而聚合()不适用于非数据帧。

提前谢谢了 :)

4

2 回答 2

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])

运算符取左侧,并将其%>%作为第一个参数传递到右侧。它对于将您的语句链接在一起而不会被数百个嵌套括号混淆非常有用。在我看来,它使事情更容易阅读。

于 2016-02-07T10:02:28.743 回答
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 的纬度和经度的平均值(或质心)。函数 (column-bind) 允许您选择要聚合的cbind多个变量,类似于 Excel 数据透视表。

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

于 2016-02-07T18:17:41.847 回答