首页 文章

像问题一样,但需要数据帧输出 - R.

提问于
浏览
1

这是我的第一篇文章,希望我能解释一下我需要做些什么 . 我对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)

使用这种方法,我可以成功检索最小值,每天一个,但我不能采取相关的坐标和时间,以及所有其他重要信息以及它,因为数据集是近30万行,我真的可以不要手工做 .

基本上,我需要获得与tapply相同的结果,但是我需要找到该点的整个行而不是单个点 .

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

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), ] 
    )
    
  • 2

    这是使用split-apply范例的一个基本解决方案,它至少在开始时构成了plyr函数的基础:

    lapply( 
         split(dat, list(dat$Month, dat$Day)),
             function(d) d[ which.min(d$Accuracy), ])
    
  • 2

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

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

    如果你需要逐月或一年或者其他什么,那么只需将它们作为列表添加到ave的第二个参数中 . 这是另一种语法 .

    mins <- with( datasub1, ave(accuracy, day, month, FUN = min) )
    

相关问题