R 在系数组中的最小值和最大值后选择x条记录

R 在系数组中的最小值和最大值后选择x条记录,r,dplyr,data.table,tidyverse,R,Dplyr,Data.table,Tidyverse,我有一个来自不同地点和不同年份的每日温度数据集。我想选择最小值,然后在每年内每个位置的该值后90天记录。我还想选择最大值和90天后的记录。我很抱歉,但鉴于数据的周期性,我真的不确定如何轻松地提供一个可重复的示例 例如,如果我想提取每年最低和最高温度后3天的行,请使用以下数据: date <- c ("1985-01-01", "1985-01-02", "1985-01-03", "1985-01-04", &

我有一个来自不同地点和不同年份的每日温度数据集。我想选择最小值,然后在每年内每个位置的该值后90天记录。我还想选择最大值和90天后的记录。我很抱歉,但鉴于数据的周期性,我真的不确定如何轻松地提供一个可重复的示例

例如,如果我想提取每年最低和最高温度后3天的行,请使用以下数据:

date <- c ("1985-01-01", "1985-01-02", "1985-01-03", "1985-01-04", "1985-01-05", "1985-01-06", 
           "1985-01-07", "1985-01-08", "1985-01-09", "1985-01-10", "1985-01-11", "1985-01-12", "1985-01-13", "1985-01-14", "1985-01-15", 
           "1986-01-01", "1986-01-02", "1986-01-03", "1986-01-04", "1986-01-05", "1986-01-06", 
           "1986-01-07", "1986-01-08", "1986-01-09", "1986-01-10", "1986-01-11", "1986-01-12", "1986-01-13", "1986-01-14", "1986-01-15",
           "1987-01-01", "1987-01-02", "1987-01-03", "1987-01-04", "1987-01-05", "1987-01-06", 
           "1987-01-07", "1987-01-08", "1987-01-09", "1987-01-10", "1987-01-11", "1987-01-12", "1987-01-13", "1987-01-14", "1987-01-15")
year <- c(rep(1985, 15), rep(1986, 15), rep(1987, 15))
temp <- c(11, 10, 11, 9, 11, 12, 14, 16, 17, 16, 15, 14, 13, 12, 11, 8, 10, 11, 9, 11, 12, 14, 18, 17, 16, 19, 14, 13, 12, 11,
          11, 10, 11, 9, 11, 7, 14, 16, 17, 16, 15, 18, 17, 12, 11)
df <- as.data.frame(cbind(date, year, temp))
dflow <- df[c(4:7, 16:19, 36:39), ]   
dfhigh <- df[c(9:12, 26:29, 42:45),]

date这里有一个tidyverse解决方案。在缺乏可复制数据的情况下,我制定了一些在3年内遵循周期模式的补充数据:

库(dplyr)
图书馆(GG2)
种子(1)

df这里有一个tidyverse解决方案。在缺乏可复制数据的情况下,我制定了一些在3年内遵循周期模式的补充数据:

库(dplyr)
图书馆(GG2)
种子(1)

如果这应该非常简单,我的方法是使用
data.table
non-equijoin。。。但如果没有可靠的样本数据和期望的输出,我无法提供答案。。。所以请提供这些。谢谢,这应该非常简单,我的方法是使用
数据表
非等联接。。。但如果没有可靠的样本数据和期望的输出,我无法提供答案。。。所以请提供这些。谢谢,威尔·伊迪特,对不起,@Allan Cameron,当我把这些代码直接发布到R中时,它实际上只为每个最小值和最大值标识一个周期,而不是如图中所示的倍数。似乎它只从全局最小值和最大值开始,而不是在每年内。我的道歉-因为我在dplyr(新手机动)之后加载了plyr…事实上,对不起,@Allan Cameron当我将此代码直接发布到R中时,它实际上只为每个最小值和最大值标识一个周期-而不是如图中所示的倍数。似乎它只从全局最小值和最大值开始,而不是在每年内。我很抱歉-这是因为我在dplyr(新手机动)之后加载了plyr。。。。
plot_df <- df %>% 
  mutate(Year = lubridate::year(Date)) %>%
  group_by(Year) %>%
  mutate(post_min = +(Temp == min(Temp)),
         post_max = +(Temp == max(Temp))) %>%
  ungroup() %>%
  mutate(post_min = cumsum(post_min - lag(post_min, 90, default = 0)),
         post_max = cumsum(post_max - lag(post_max, 90, default = 0)))
  ggplot(plot_df, aes(Date, Temp)) + 
  geom_line() +
  geom_vline(aes(xintercept = Date), plot_df %>% filter(post_min > 0),
             alpha = 0.1, colour = "blue") +
  geom_vline(aes(xintercept = Date), plot_df %>% filter(post_max > 0),
             alpha = 0.1, colour = "red")