r - n 个不同的最高/最低值的最小值、最大值、平均值,并将它们与时间序列数据一起绘制在 R 中的同一图表上
问题描述
我正在处理一个带有 unix 时间戳的大型时间序列数据集(有近 10 万条记录)。我需要min, mean, max, avg_of_lowest_n, avg_of_top_n
从value
列。我可以得到min, mean, max
如下:
tapply(df$value, df$pattern, min)
tapply(df$value, df$pattern, mean)
tapply(df$value, df$pattern, max)
现在,我需要为每个模式(组)在另外两列中mean
获取lowest n distinct values
和。我可以从下面得到最低和最高的 n (比如 5 个值),但我认为不是由每个组(模式)的不同5 个值计算出来的,在这里我需要知道,我该怎么做。top n distinct values
mean
mean
setDT(df_stat) #requires Data.table
df_n[order(value)][, list(mean_of_low_5=mean(value[1:5])), by=pattern]
df_n[order(-value)][, list(mean_of_top_5=mean(value[1:5])), by=pattern]
任何简单的方法都受到高度赞赏。
样本数据-
df <- structure(list(pattern = c(462L, 462L, 462L, 462L, 462L, 462L,
462L, 462L, 462L, 462L, 462L, 463L, 463L, 463L, 463L, 463L, 463L,
463L, 463L, 463L, 463L, 463L, 463L, 463L, 463L, 464L, 464L, 464L,
464L, 464L, 464L, 464L, 464L, 464L, 464L, 464L, 464L, 464L, 465L,
465L, 465L, 465L, 465L, 466L, 466L, 466L, 466L, 466L, 466L, 466L,
466L, 466L, 466L, 466L, 466L, 961L, 961L, 961L, 961L, 961L, 961L,
961L), value = c(5.8e+10, 4.35e+10, 3.96e+10, 3.6e+10, 3.48e+10,
3.3e+10, 3.3e+10, 3.3e+10, 3.3e+10, 3.3e+10, 3.3e+10, 1e+09,
1e+09, 1e+09, 1e+09, 1e+09, 1e+09, 1e+09, 1e+09, 1e+09, 1e+09,
1e+09, 1e+09, 1e+09, 1e+09, 3.3e+10, 3.3e+10, 3.3e+10, 3.3e+10,
3.3e+10, 3.3e+10, 3.3e+10, 3.3e+10, 3.3e+10, 3.3e+10, 3.3e+10,
3.3e+10, 3.3e+10, 3e+10, 3e+10, 3e+10, 3e+10, 3e+10, 3.3e+10,
3.3e+10, 3.3e+10, 3.3e+10, 3.3e+10, 3.3e+10, 3.3e+10, 3.3e+10,
3.3e+10, 3.2e+10, 3.2e+10, 3.2e+10, 2.6e+10, 2.6e+10, 2.6e+10,
2.6e+10, 2.6e+10, 2.6e+10, 2.6e+10), timestamp = c(1590604157L,
1590604157L, 1590604157L, 1590604157L, 1590604157L, 1590604157L,
1590604157L, 1590604157L, 1590604157L, 1590604157L, 1590604157L,
1590604170L, 1590604170L, 1590604170L, 1590604170L, 1590604170L,
1590604170L, 1590604170L, 1590604170L, 1590604170L, 1590604170L,
1590604170L, 1590604170L, 1590604170L, 1590604170L, 1590604213L,
1590604213L, 1590604213L, 1590604213L, 1590604213L, 1590604213L,
1590604213L, 1590604213L, 1590604213L, 1590604213L, 1590604213L,
1590604213L, 1590604213L, 1590604226L, 1590604226L, 1590604226L,
1590604226L, 1590604226L, 1590604239L, 1590604239L, 1590604239L,
1590604239L, 1590604239L, 1590604239L, 1590604239L, 1590604239L,
1590604239L, 1590604239L, 1590604239L, 1590604239L, 1590610895L,
1590610895L, 1590610895L, 1590610895L, 1590610895L, 1590610895L,
1590610895L)), class = "data.frame", row.names = c(NA, -62L))
解决方案
您可以使用以下命令在一个管道中进行所有计算dplyr
:
library(dplyr)
df %>%
group_by(pattern) %>%
summarise(min_val = min(value),
max_val = max(value),
mean_val = mean(value),
lowest_n_val = mean(head(unique(sort(value)), 5)),
highest_n_val = mean(tail(unique(sort(value)), 5)))
如果您有数据,您可以添加na.rm. =TRUE
上述所有功能NA
。
推荐阅读
- swift - oauth2 身份验证在 iPhone 中不起作用
- vb.net - 当.name 属性在设计时未知时,如何为列表框控件的单击事件编程
- css - 960px 以下的内容框 - 超出窗口
- r - 如何在R中的文件列表中选择多个具有不同扩展名的文件
- java - 一个带有多个 .xml 文件的 Java 类
- android - Google 地图 getTag() 始终为 null,即使 setTag() 不是
- android - 如何在Android中使用cordova文件字段选择多个文件?
- javascript - 在 R Leaflet 中实现(javascript)插件
- scrapy - Scrapy:无法获取有关达到最大重试次数的 URL 的信息
- c++ - C++ 中的快速范围搜索实现