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

5

我想将数据框的子集用于选择具有每日最大值的行。

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

希望这能更清晰一些。
1个回答

7

在尝试使用原始数据框代码之后,我意识到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

那并不会返回行数,所以你无法知道哪一行拥有最大值,例如,你无法找到我的df中具有最大值的'Z'的值。 - Spacedman
嗨,谢谢。这很接近了。然而,由于我有许多网站作为副本,所以变量“day”会重复出现。因此,我有18个网站,因此在数据框中例如有18个97天。您提供的代码提供了每个日期值的绝对最大值,而不考虑网站。我需要的是提供每个网站的每日最大值的数据框。我可以分别为每个站点使用代码,然后稍后附加。有捷径吗?再次感谢Diarm - Diarmuid Ryan
你能否编辑你的问题,提供一个完整的例子,加上更多的行和你希望得到的输出? - Spacedman
更加清晰!另一个技巧是使用“dput”来提供简短的数据示例,我们可以直接读入R以运行测试。无论如何,获取您想要的很简单...请参见修改后的答案... - Spacedman
太好了,谢谢。我正准备在 Excel 上度过漫长的一晚! - Diarmuid Ryan
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接