2013-09-27 30 views
1

我需要计算一天开始和最小值发生时间之间的最大值。这是我的数据集的1天,一个dendro玩具例如:计算当天开始和最小值之间的最大值

   TIMESTAMP year DOY ring dendro diameter 
1 2013-05-02 00:00:00 2013 122 1  1  3405 
2 2013-05-02 00:15:00 2013 122 1  1  3317 
3 2013-05-02 00:30:00 2013 122 1  1  3217 
4 2013-05-02 00:45:00 2013 122 1  1  3026 
5 2013-05-02 01:00:00 2013 122 1  1  4438 
6 2013-05-03 00:00:00 2013 123 1  1  3444 
7 2013-05-03 00:15:00 2013 123 1  1  3410 
8 2013-05-03 00:30:30 2013 123 1  1  3168 
9 2013-05-03 00:45:00 2013 123 1  1  3373 
10 2013-05-02 00:00:00 2013 122 2  4  5590 
11 2013-05-02 00:15:00 2013 122 2  4  5602 
12 2013-05-02 00:30:00 2013 122 2  4  5515 
13 2013-05-02 00:45:00 2013 122 2  4  4509 
14 2013-05-02 01:00:00 2013 122 2  4  5566 
15 2013-05-02 01:15:00 2013 122 2  4  6529 

首先,我计算出的MIN直径的每一天(DOY =一年的日)中的每个dendro(包含在一个环),也越来越发生了什么是最小值的时间:

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

现在,我的问题是,我要计算的MAX直径的每一天。但是,有时最小值出现在最小值之后。我只对包含在最小值之前的最大值感兴趣。如果它在分钟后发生,我对最大总值不感兴趣。因此,我需要在从开始日子(00:00:00)到最小直径的时间范围内包含最大值(每天)。就像我对min的做法一样,我也需要知道在什么时候发生了最大值。这是我想从以前的DF:

year DOY ring dendro    timeMin min    timeMax max 
1 2013 122 1  1 2013-05-02 00:45:00 3026 2013-05-02 00:00:00 3405 
2 2013 123 1  1 2013-05-03 00:30:00 3168 2013-05-03 00:00:00 3444 
3 2013 122 2  4 2013-05-02 00:45:00 4509 2013-05-02 00:00:15 5602 

正如你所看到的,最小值是实际的最小值。但是,我想要的最大值不是一天的最大值,而是一天开始和最小值之间发生的最大值。 我第一次尝试,失败,返回当天的最大值,即使在它超出期望的时间间隔:

dailymax <- ddply(datamelt, .(year, DOY, ring, dendro), 
function(x)x[which.max(x$diameter[1:which.min(datamelt$diameter)]), ]) 

任何想法?

+1

我想你的问题可以澄清,如果你提供三天或四天的示例数据显示所需的结果。也许只是每天提供五行数据。 –

+0

感谢您的建议。发布更新 –

+0

我认为一个更好的玩具例子会抛弃rownames,或者放弃常量变量(year,DOY,ring,dendro)或者创建一些变体(因为我们应该将它们分组)。 – Frank

回答

1

在data.table,你可以写:

DT[,{ 
    istar <- which.min(diameter) 
    list(
    dmin=diameter[istar], 
    prevmax=max(diameter[1:istar]) 
)},by='year,DOY,ring,dendro'] 

# year DOY ring dendro dmin prevmax 
# 1: 2013 242 6  8 470 477.2 

我认为类似的功能可以与您的**ply

EDIT1被写成:其中DT来自...

require(data.table) 
DT <- data.table(header=TRUE, text=' 
date TIMESTAMP year DOY ring dendro diameter 
1928419 2013-08-30 00:00:00 2013 242 6  8 471.5 
1928420 2013-08-30 01:30:00 2013 242 6  8 477.2 
1928421 2013-08-30 03:00:00 2013 242 6  8 474.7 
1928422 2013-08-30 04:30:00 2013 242 6  8 470.0 
1928423 2013-08-30 06:00:00 2013 242 6  8 475.6 
1928424 2013-08-30 08:30:00 2013 242 6  8 478.7') 

你的“TIMESTAMP”中有一个空格,所以我将它看作两列,第一列叫做“日期”。如果你喜欢,将它们粘贴在一起接下来的时间,你可以考虑做一个“可重复的例子”,如下所述:How to make a great R reproducible example?

EDIT2:对于最大值和最小值的时间:

DT[,{ 
    istar <- which.min(diameter) 
    istar2 <- which.max(diameter[1:istar]) 
    list(
    dmin  = diameter[istar], 
    tmin  = TIMESTAMP[istar], 
    dmax  = diameter[istar2], 
    tmax  = TIMESTAMP[istar2] 
)},by='year,DOY,ring,dendro'] 

# year DOY ring dendro dmin  tmin dmax  tmax 
# 1: 2013 242 6  8 470 04:30:00 477.2 01:30:00 

正如EDIT1所提到的,我不在单个列中没有TIMESTAMP变量的两个部分,因为您没有以这种方式提供它们。要添加更多列,只需在上面的list()中添加新的表达式即可。代码背后的想法是,{}表达式是一个代码块,您可以在其中处理与每个year,DOY,ring,dendro组合关联的数据块中的变量,并返回新列的列表。

+0

我对data.table不熟悉。当我使用你的函数时,我得到了这个: ''.data.frame'(datamelt,,{: 未使用的参数(by =“year,DOY,ring,dendro”)错误' 另外。在所需的例子中获得最大值和最小值的时间? –

+0

@fede_luppi哦,对不起,我编辑了它以包括如何将数据读入DT的解释;以及如何将时间最小值和最大值添加为你在你的问题中提到过,我认为如果你运行require(data.table)然后DT Frank

相关问题