1

我有一个这样的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(每日分钟)=12634:

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

这是我的问题: - 当有几个最小值时,i) 方式如何工作?- 更重要的是,在 ii) 的方式中,当有几个最小值时,我怎么能只让最小值发生在更远的时间?例如,对于环 #2 中的 dendro #5 的图像,在 3598mm 直径中有 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" ...

谢谢

4

1 回答 1

4

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

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

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), ])
                  })
于 2013-09-19T00:22:22.870 回答