1

这是我的第一篇文章,所以希望我能解释一下我需要做什么。我对 R 还是很陌生,我可能已经阅读过回答这个问题的帖子,但我终其一生都无法理解它们的含义。因此,如果这已经得到回答,请提前道歉。

我有一个非常大的来自无线电项圈的 GPS 位置数据集,并且每天的位置数量不一致。我想浏览数据集并根据 GPS 信号的准确度为每天选择一个数据点。

所以它基本上看起来像这样。

Accuracy    Month    Day    Easting    Northing    Etc
   5          6       1     #######    ########     #
   3.2        6       1     #######    ########     #
   3.8        6       1     #######    ########     #
   1.6        6       2     #######    ########     #
   4          6       3     #######    ########     #
   3.2        6       3     #######    ########     #

我想提取每天最准确的点(最低准确度度量),同时保留其余的相关数据。

目前我一直在使用tapply功能

datasub1<-subset(data,MONTH==6)
tapply(datasub1$accuracy, datasub1$day, min)

使用这种方法,我可以成功检索最小值,每天一个,但是我无法获取相关的坐标和时间以及所有其他重要信息,并且由于数据集接近 300 000 行,我真的可以不要用手做。

所以本质上,我需要得到与 tapply 相同的结果,但是我需要找到该点的整行而不是单个点。

提前感谢任何可以伸出援助之手的人。如果您需要更多信息,请告诉我,我会尽力为您提供。

4

3 回答 3

6

您可以使用ddply:它将一个 data.frame 切成小块(每天一个)并对每一块应用一个函数。

# Sample data
n <- 100
d <- data.frame(
  Accuracy = round(runif(n, 0, 5), 1),
  Month    = sample(1:2, n, replace=TRUE),
  Day      = sample(1:5, n, replace=TRUE),
  Easting  = rnorm(n),
  Northing = rnorm(n),
  Etc      = rnorm(n)
)

# Extract the maximum for each day
# (In case of ties, you only have the first row)
library(plyr)
ddply( 
  d, 
  c("Month", "Day"), 
  function (u) u[ which.min(u$Accuracy), ] 
)
于 2012-01-19T01:42:25.907 回答
2

这是一个使用拆分应用范式的基本解决方案,它至少在一开始就构成了 plyr 函数的基础:

lapply( 
     split(dat, list(dat$Month, dat$Day)),
         function(d) d[ which.min(d$Accuracy), ])
于 2012-01-19T02:26:19.290 回答
2

所以你真的不想以任何方式聚合。您需要做的就是选择每天的最小值。因此,您需要做的就是找到最小值并选择匹配项。

mins <- ave(datasub1$accuracy, datasub1$day, FUN = min)
datasub1[ datasub1$accuracy == mins, ]

如果您需要逐月或逐年或其他任何时间,只需将它们作为列表添加到 ave 的第二个参数。这是另一种语法。

mins <- with( datasub1, ave(accuracy, day, month, FUN = min) )
于 2012-01-19T05:19:56.490 回答