【问题标题】:R- Several min values using ddplyR- 使用 ddply 的几个最小值
【发布时间】:2013-09-18 23:50:31
【问题描述】:

我有一个这样的 df:

> head(datamelt)
                  TIMESTAMP ring dendro diameter   ID Rain_mm_Tot year DOY
1373635 2013-05-02 00:00:00    1      1     3405 r1_1           0 2013 122
1373672 2013-05-02 00:15:00    1      1     3417 r1_1           0 2013 122
1373735 2013-05-02 00:30:00    1      1     3417 r1_1           0 2013 122
1373777 2013-05-02 00:45:00    1      1     3426 r1_1           0 2013 122
1373826 2013-05-02 01:00:00    1      1     3438 r1_1           0 2013 122
1373873 2013-05-02 01:15:00    1      1     3444 r1_1           0 2013 122

我使用 ddply 以两种不同的方式获取每个 dendro (dendrometers) 中每年 (DOY) 的最小直径值:i) 第一个完成它的工作,为每天和 dendro 提供一个值。 nrow(每日分钟)=5784。但是,我不知道当一天有几个最小值时它会做什么,但在这种情况下,它不是我需要的结果:

library(plyr)
dailymin <- ddply(datamelt, .(year,DOY,ring,dendro), function(x)x[which.min(x$diameter), ])

ii) 如果有几个最小值,则第二种方法每天返回几行,这没关系。 nrow(dailymin)=12634:

dailymin <- ddply(datamelt, .(year,DOY,ring,dendro), function(x)x[x$diameter==min(x$diameter), ])

这是我的问题: - 当有几个最小值时,i) 方法如何工作? - 更重要的是,在 ii) 方式中,当有几个最小值时,我怎么能只让最小值发生在更远的时间?例如,对于环 #2 中的 dendro #5,在 3598 毫米直径中存在 3 个最小值,发生在 13:15、13:30 和 13:45。我只想拥有最后一个(13:45)并删除其他人。

> str(dailymin$TIMESTAMP)
 POSIXct[1:12634], format: "2013-05-02 13:45:00" "2013-05-02 08:45:00" "2013-05-02 14:00:00" "2013-05-02 13:45:00" "2013-05-02 14:45:00" ...

谢谢

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    对于您的第一个问题:如文档所述,which.min 返回在x$diameter 中遇到的第一个最小值的索引。

    关于你的第二个问题:假设x 已经通过增加TIMESTAMP 进行排序(在你的例子中似乎就是这种情况),你可以编写自己的last.min 函数来完全像which.min 那样做但返回last 最小值的索引:

    last.min <- function(x) length(x) - which.min(rev(x)) + 1L
    dailymin <- ddply(datamelt, .(year, DOY, ring, dendro),
                      function(x)x[last.min(x$diameter), ])
    

    如果你的数据不是按TIMESTAMP排序的,你可以使用arrange对它进行递减TIMESTAMP排序,然后使用which.min

    dailymin <- ddply(datamelt, .(year, DOY, ring, dendro),
                      function(x) {
                         x <- arrange(x, desc(TIMESTAMP))
                         x[which.min(x$diameter), ])
                      })
    

    【讨论】:

    • 同理,您也可以通过-diameter(升序负数)和timestamp 一次性使用order,然后在每个小节中取第一行(例如,使用@ 987654336@).
    • 是的,虽然我相信它会更贵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多