使用聚合获得R中每年第四高的值
我有一个来自日期和值的数据。我正在尝试使用dplyr和order或多个聚合语句获得每年第四高的值。我想要第四个最高值出现的日期,以及所有年份的数据框中的值 这是我的剧本:使用聚合获得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
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每年只得到一个。但我需要的是整个事件发生的日期,而不仅仅是上面指定的年份。我已将脚本编辑为