如果这是一个愚蠢的问题,我事先表示歉意。非常感谢您的帮助。
我有一个具有多个站点和采样年的数据集,并为一年中的每一天评分。例如,SiteA有40年的数据,每天都有一个值,采样年定义为Sampling.Year。让我们感到困惑的采样年是7月至6月,因此采用2016-2017年的形式。总共有8个变量,并且有很多NA。例如:
SiteName Sampling.Year End.Date H1_roll T1_roll ... ...
A 2015-2016 1 NA
A 2015-2016 5 NA
A 2015-2016 2 NA
A 2016-2017 3 5
A 2016-2017 12 14
A 2016-2017 6 7
B 2015-2016 9 etc
B 2015-2016 2
B 2015-2016 1
B 2016-2017 4
B 2016-2017 1
B 2016-2017 7
我需要对此数据集做一些事情。首先,我需要添加一列“ Start.Date”,即End.Date-182天。然后,我需要忽略(或告诉R忽略)列T1_roll中所有带有NA的行。
下一步是为每个站点和采样年选择最高的T1_roll分数,但是我需要确保其余信息仍保留在该选择中。即从上面的示例中,站点A在2016-17年的最大T1_roll为14,新数据框将包含该行中的所有变量:
SiteName Sampling.Year Start.Date End.Date H1_roll T1_roll ... ...
A 2016-2017 12 14
我在这里保存了一个示例数据集:Rolling Score Example。
谢谢
答案 0 :(得分:1)
我们可以按'SiteName'和slice
将行与max
的值为'T1_roll'分组
library(dplyr)
df1 %>%
group_by(SiteName) %>%
slice(which.max(T1_roll))
或与filter
df1 %>%
group_by(SiteName) %>%
filter(T1_roll == max(T1_roll, na.rm = TRUE))
在base R
中,可以使用ave
i1 <- with(df1, ave(T1_roll, SiteName, FUN =
function(x) max(x, na.rm = TRUE)) == T1_roll)
df1[i1, ]