选择R中包含每日最大值的行



因此,我想对数据帧进行子集设置,以选择具有每日最大值的行。

Site    Year   Day     Time      Cover       Size TempChange
 ST1    2011    97      0.0     Closed      small       0.97
 ST1    2011    97      0.5     Closed      small       1.02
 ST1    2011    97      1.0     Closed      small       1.10

数据帧的部分在上面。我只想为每个变量Day选择具有变量TempChange最大值的行。我之所以想这样做,是因为我对这些特定时间的特定变量(未显示)感兴趣。

修改示例和所需输出

Site  Day   Temp     Row
a     10    0.2     1
a     10    0.3     2
a     11    0.5     3
a     11    0.4     4
b     10    0.1     5
b     10    0.8     6
b     11    0.7     7
b     11    0.6     8
c     10    0.2     9
c     10    0.3     10
c     11    0.5     11
c     11    0.8     12

要求输出

Site  Day   Temp     Row
a     10    0.3     2
a     11    0.5     3
b     10    0.8     6
b     11    0.7     7
c     10    0.3     10
c     11    0.8     12

希望这能让事情变得更清楚。

在处理了原始数据帧代码后,我意识到plyr可以在一个中做到这一点

> df
  Day          V Z
1  97 0.26575207 1
2  97 0.09443351 2
3  97 0.88097858 3
4  98 0.62241515 4
5  98 0.61985937 5
6  99 0.06956219 6
7 100 0.86638108 7
8 100 0.08382254 8
> ddply(df,~Day,function(x){x[which.max(x$V),]})
  Day          V Z
1  97 0.88097858 3
2  98 0.62241515 4
3  99 0.06956219 6
4 100 0.86638108 7

若要获取多个列的唯一组合的最大值行,只需将变量添加到公式中即可。对于您修改后的示例,它是:

> df
   Site Day Temp Row
1     a  10  0.2   1
2     a  10  0.3   2
3     a  11  0.5   3
4     a  11  0.4   4
5     b  10  0.1   5
6     b  10  0.8   6
7     b  11  0.7   7
8     b  11  0.6   8
9     c  10  0.2   9
10    c  10  0.3  10
11    c  11  0.5  11
12    c  11  0.8  12
> ddply(df,~Day+Site,function(x){x[which.max(x$Temp),]})
  Site Day Temp Row
1    a  10  0.3   2
2    b  10  0.8   6
3    c  10  0.3  10
4    a  11  0.5   3
5    b  11  0.7   7
6    c  11  0.8  12

请注意,这与原始数据帧的顺序不同,但您可以修复它。

> dmax = ddply(df,~Day+Site,function(x){x[which.max(x$Temp),]})
> dmax[order(dmax$Row),]
  Site Day Temp Row
1    a  10  0.3   2
4    a  11  0.5   3
2    b  10  0.8   6
5    b  11  0.7   7
3    c  10  0.3  10
6    c  11  0.8  12

最新更新