使用聚合获得R中每年第四高的值

使用聚合获得R中每年第四高的值,r,sorting,dataframe,aggregate,R,Sorting,Dataframe,Aggregate,我有一个来自日期和值的数据。我正在尝试使用dplyr和order或多个聚合语句获得每年第四高的值。我想要第四个最高值出现的日期,以及所有年份的数据框中的值 这是我的剧本: timeozone <- import(i, date="DATES", date.format = "%Y-%m-%d %H", header=TRUE, na.strings="NA") colnames(timeozone) <- c

我有一个来自日期和值的数据。我正在尝试使用dplyr和order或多个聚合语句获得每年第四高的值。我想要第四个最高值出现的日期,以及所有年份的数据框中的值

这是我的剧本:

    timeozone <- import(i, date="DATES", date.format = "%Y-%m-%d %H", header=TRUE, na.strings="NA")
    colnames(timeozone) <- c("column","date", "O3")
    timeozone %>%
      mutate(month = format(date, "%m"), day = format(date, "%d"), year = format(date, "%Y")) %>%
      group_by(month, day, year) %>%
      summarise(fourth = O3[order(O3, decreasing = TRUE)[4] ])
timeozone%
分组依据(月、日、年)%>%
总结(第四个=O3[顺序(O3,递减=真)[4]]
我不确定我上面的东西有什么问题。任何帮助都将不胜感激

数据:

日期值

11/12/2000 14

11/13/2000 16

11/14/2000 17

11/15/2000 21

11/13/2001 31

11/14/2001 21

11/15/2001 62

11/16/2001 14


由于您没有提供可复制的数据,下面是一个使用
iris
的示例。你需要按年龄分组,而不是按物种分组,但同样的想法也适用

如果您不热衷于聚合,则可以使用
dplyr
相对直接地执行此操作:

iris %>%
  group_by(Species) %>%
  summarise(fourth = Petal.Length[order(Petal.Length, decreasing = TRUE)[4] ])
给出:

     Species fourth
1     setosa    1.7
2 versicolor    4.9
3  virginica    6.6
您可以使用以下方法确认值是否正确:

by(iris$Petal.Length, iris$Species, sort)
按照@tchakravarty的建议,使用第n个

iris %>%
  group_by(Species) %>%
  summarise(fourth = nth(sort(Petal.Length), -4L))

给出与上面相同的值。

由于您没有提供可复制的数据,下面是一个使用
iris
的示例。你需要按年龄分组,而不是按物种分组,但同样的想法也适用

如果您不热衷于聚合,则可以使用
dplyr
相对直接地执行此操作:

iris %>%
  group_by(Species) %>%
  summarise(fourth = Petal.Length[order(Petal.Length, decreasing = TRUE)[4] ])
给出:

     Species fourth
1     setosa    1.7
2 versicolor    4.9
3  virginica    6.6
您可以使用以下方法确认值是否正确:

by(iris$Petal.Length, iris$Species, sort)
按照@tchakravarty的建议,使用第n个

iris %>%
  group_by(Species) %>%
  summarise(fourth = nth(sort(Petal.Length), -4L))
给出与上面相同的值。

另一个带base的选项(并再次使用iris数据)是按组拆分变量,然后对其排序并提取第四个元素。比如说

data(iris)
petals <- split(iris$Petal.Length, iris$Species)
sapply(petals, function(x) x[order(x)][4])
编辑 使用上面的示例数据,您可以提取整行(如果需要,也可以只提取日期),如下所示

date <- c("11/12/00", "11/13/00", "11/14/00", "11/15/00", "11/13/01", 
"11/14/01", "11/15/01", "11/16/01")

value <- c(14, 16, 17, 21, 31, 21, 62, 14)

date_splt <- strsplit(date, "/")
year <- sapply(date_splt, "[", 3)

d <- data.frame(date, value, year)

d_splt <- split(d, d$year)
lapply(d_splt, function(x) x[order(x$value), ][4, ])
date另一个带base的选项(再次使用iris数据)是按组分割变量,然后对其排序并提取第四个元素。比如说

data(iris)
petals <- split(iris$Petal.Length, iris$Species)
sapply(petals, function(x) x[order(x)][4])
编辑 使用上面的示例数据,您可以提取整行(如果需要,也可以只提取日期),如下所示

date <- c("11/12/00", "11/13/00", "11/14/00", "11/15/00", "11/13/01", 
"11/14/01", "11/15/01", "11/16/01")

value <- c(14, 16, 17, 21, 31, 21, 62, 14)

date_splt <- strsplit(date, "/")
year <- sapply(date_splt, "[", 3)

d <- data.frame(date, value, year)

d_splt <- split(d, d$year)
lapply(d_splt, function(x) x[order(x$value), ][4, ])


date试试
dplyr::nth()
。在编辑中,为什么要按
月份
分组?我以为你想要的是每年第四大的价值。从您发布的示例数据来看,没有
03
列(即
?),而且似乎每天只有一个值——如果是这样的话,就不会有第四高。尝试仅按
年进行分组
尝试
dplyr::nth()
。在编辑中,为什么要按
日进行分组?我以为你想要的是每年第四大的价值。从您发布的示例数据来看,没有
03
列(即
?),而且似乎每天只有一个值——如果是这样的话,就不会有第四高。尝试仅按
年份进行分组
提供
nth
这是一种更简单的方法。谢谢--我应该知道有更好的方法。谢谢你告诉我。你可能想检查一下你的答案中是否真的需要排序。但是每年的第四个值呢?我有20年的数据,我希望每年得到一个值。我确实尝试过,最初没有排序(只是学习如何处理第n个),它会返回最后一个条目的第4个值。您的建议(刚刚删除)使用
order\u by=Petal.Length
而不是
sort
ing是一个不错的选择。我倾向于认为,
sort
更清晰,更少键入,但这更多的是观点而不是客观差异。
dplyr
提供了
n
这是一种更简单的方法。谢谢——我应该知道有更好的方法。谢谢你告诉我。你可能想检查一下你的答案中是否真的需要排序。但是每年的第四个值呢?我有20年的数据,我希望每年得到一个值。我确实尝试过,最初没有排序(只是学习如何处理第n个),它会返回最后一个条目的第4个值。您的建议(刚刚删除)使用
order\u by=Petal.Length
而不是
sort
ing是一个不错的选择。我倾向于认为,
sort
更清晰,打字更少,但这更多的是观点,而不是客观差异。好吧,我有每日数据,我如何看待仅仅一年?我不确定我会遵循。。。年份是分组变量吗?还是白天?无论分组变量是什么,它都会指向物种所在的位置,无论您想从中提取第四个元素的变量是什么,它都会指向Petal.length所在的位置。我现在使用mutate得到了分组变量,即year,使用mutate每年只得到一个。但我需要的是整个事件发生的日期,而不仅仅是上面指定的年份。我对脚本进行了编辑,将其包括在内,并添加了数据。听起来您只需要创建一个新的日期变量,并将其放在Petal.Length所在的位置,但我可能有误解,因为我看不到您的数据,因此无法像您一样看到问题。若你们可以发布一个数据样本或模拟一些合理反映你们的数据,我可能会进一步提供帮助。我发布了样本数据,好的,我有每日数据,我怎么看一年?我不确定我会遵循。。。年份是分组变量吗?还是白天?无论分组变量是什么,它都会指向物种所在的位置,无论您想从中提取第四个元素的变量是什么,它都会指向Petal.length所在的位置。我现在使用mutate得到了分组变量,即year,使用mutate每年只得到一个。但我需要的是整个事件发生的日期,而不仅仅是上面指定的年份。我已将脚本编辑为