这是我的第一篇文章,希望我能解释一下我需要做些什么。我对R来说还是很新,我可能已经阅读了回答这个问题的帖子,但我不能为我的生活理解他们的意思。如果已经回答,请提前道歉。
我有一个非常大的GPS位置数据集来自radiocollars,并且每天的位置数量不一致。我想浏览数据集,并根据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相同的结果,但是我需要找到该点所在的整行,而不是单个点。
提前感谢任何可以伸出援助之手的人。如果您需要更多信息,请告诉我,我会尽力为您解答。
答案 0 :(得分: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), ]
)
答案 1 :(得分:2)
这是使用split-apply范例的一个基本解决方案,它至少在开始时构成了plyr函数的基础:
lapply(
split(dat, list(dat$Month, dat$Day)),
function(d) d[ which.min(d$Accuracy), ])
答案 2 :(得分:2)
所以你真的不想以任何方式聚合。您所需要做的就是选择每天的最低要求。所以,你需要做的就是找到最小值并选择匹配。
mins <- ave(datasub1$accuracy, datasub1$day, FUN = min)
datasub1[ datasub1$accuracy == mins, ]
如果您需要逐月或一年或者其他什么,那么只需将它们作为列表添加到ave的第二个参数中。这是另一种语法。
mins <- with( datasub1, ave(accuracy, day, month, FUN = min) )