我有一个简单的问题。 R中的aggregate()函数根据指定的条件在数据帧上运行。
聚合(my.data.frame,列表(所需列),要应用的功能)是默认用法。
计算简单函数(如数据框的列特定值的均值和中值)非常有用。但是,我所拥有的功能是不对数据帧进行操作,但我需要在特定列上执行此功能后聚合我的数据帧。让我展示数据集:
所以我需要为每个BSSID计算经度和纬度点的质心,我需要以这种方式聚合它。我在各种软件包中在线找到的函数计算了值矩阵的质心,而不是数据框,而aggregate()不能处理非数据框。
非常感谢提前:)
答案 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()
还原为矩阵。