【问题标题】:Aggregating functions which operate on non-data frame objects in R在 R 中对非数据框对象进行操作的聚合函数
【发布时间】:2016-05-17 01:48:50
【问题描述】:

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

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

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

GPS Dataset

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

提前非常感谢:)

【问题讨论】:

  • 请不要使用图片来展示您的数据。而是发布数据(或部分数据)。 stackoverflow.com/questions/5963269/…
  • 顺便说一句,我非常有信心可以使用aggregate() 处理您的问题,但是如果没有关于您的功能和数据的任何切实信息,您的问题的答案需要相当多的猜测。
  • @RHertel,我以后会发布更好的问题。对环境有点陌生:)
  • 我通过聚合得到它,通过将空间坐标转换为笛卡尔坐标。谢谢你:)

标签: r gps aggregate-functions geospatial centroid


【解决方案1】:

我喜欢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])

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

【讨论】:

  • 应该调查一下,谢谢 :) 你能向我解释一下 %>% 部分吗,谷歌告诉我它是一个特殊包的一部分,但是当我安装它时一切都不起作用。
  • 它被称为“管道”运算符。它来自magrittr 包,但与dplyr 包捆绑在一起,因此您不需要单独加载magrittr。您可以将其理解为“然后”——它可以帮助您将操作指定为一个块,而不是多个步骤。我将在上面的答案中进行编辑,以显示没有这个的另一种做事方式。
【解决方案2】:

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 函数(column-bind)允许您选择多个要聚合的变量,类似于 Excel 数据透视表。

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

【讨论】:

  • 正如您所展示的,它与矩阵完美配合,但质心计算功能仍然很困难,mean() 似乎对空间坐标不公平。非常感谢,下次会以更好的格式发布我的问题。
  • 我已经将空间坐标转换为笛卡尔坐标,然后取平均值。我猜应该可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 2018-04-09
  • 2013-05-19
相关资源
最近更新 更多