R-使用ddply的几个最小值

时间:2013-09-18 23:50:31

标签: r plyr

我有这样的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(dendrome)中每年(DOY)的最小直径值:i)第一个完成其工作,每天给出一个值和dendro。 nrow(dailymin)= 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,在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" ...

由于

1 个答案:

答案 0 :(得分:4)

关于您的第一个问题:如文档所述,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), ])
                  })