【问题标题】:tapply like issue, but require dataframe output - R类似问题,但需要数据帧输出 - R
【发布时间】:2012-01-19 01:29:07
【问题描述】:

这是我的第一篇文章,所以希望我能解释一下我需要正确做什么。我对 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 相同的结果,但我需要找到该点的整行,而不是单个点。

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

【问题讨论】:

    标签: r gps plyr tapply


    【解决方案1】:

    您可以使用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), ] 
    )
    

    【讨论】:

    • 太棒了!非常感谢,我在搜索中偶然发现了 ddply 好几次,但我不知道如何将它应用到我自己的东西上。就像我说的,R 的新手,它绝对不是我的强项。再次感谢。我不完全确定精度,月份和日期之后的编程是什么。我和他们一起得到了一些古怪的数字,当我把它们拿出来时,一切都如我所愿。但现在一切都很好,为我节省了大量时间。再次感谢。
    • @mathematical.coffee:我已将我的最大值替换为最小值,以匹配原始问题。
    • @HeidelbergSlide,如果这个答案对你有用,那么点击答案左上角的绿色小勾——它会让未来的用户遇到和你一样的问题你如何修复它,以便他们也可以。
    【解决方案2】:

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

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

    【讨论】:

    • 我很好奇有人会如何在基地处理这个问题。我自己没有答案。很好的解决方案。您的解决方案似乎生成了一个列表结构(对我而言),并且不会提供 HeidelbergSlide 似乎想要的漂亮数据框。修改您的回复并使用 sapply 然后用 t() 包装它似乎可以提供一个更接近地代表发布者期望结果的数据框。
    【解决方案3】:

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

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

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

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

    【讨论】:

    • 我认为这对“...我需要找到该点的整行”没有帮助。它只会返回准确度和日期列。
    • 现已修复...没有编辑历史记录,所以要么我错过了它,要么是后来添加的
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 2016-10-20
    • 2014-07-31
    • 1970-01-01
    • 2011-02-04
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多