我有这样的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" ...
由于
答案 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), ])
})