- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个多维数组,其中第 3 维表示时间。出于这个问题的目的,让我们使用 plyr
包中的 ozone
数据集:
> str(ozone)
num [1:24, 1:24, 1:72] 260 258 258 254 252 252 250 248 248 248 ...
- attr(*, "dimnames")=List of 3
..$ lat : chr [1:24] "-21.2" "-18.7" "-16.2" "-13.7" ...
..$ long: chr [1:24] "-113.8" "-111.3" "-108.8" "-106.3" ...
..$ time: chr [1:72] "1" "2" "3" "4" ...
来自文档:
The data are monthly ozone averages on a very coarse 24 by 24 grid covering Central America, from Jan 1995 to Dec 2000. The data is stored in a 3d area with the first two dimensions representing latitude and longitude, and the third representing time.
我想做的是为每个纬度/经度单元格创建月平均值。我可以像这样使用 tapply
为单个纬度/经度组合执行此操作:
> tapply(ozone[1,1,], rep(1:12, 6), mean)
1 2 3 4 5 6 7 8 9 10 11 12
264.6667 257.6667 255.0000 251.3333 257.6667 265.0000 274.0000 275.3333 277.0000 285.0000 283.0000 273.3333
但我很难一次对整个数组执行此操作。 apply
将让我选择要操作的维度 (MARGIN
),tapply
将让我使用一个因子来选择切片 (INDEX
),但我两者都需要。
我乐于接受建议,但由于数据的大小和复杂性,我更喜欢使用数组而不是数据框。
下面来自 GKi 和 G 的两个优秀答案。 Grothendieck,非常感谢他们。我已将它们置于 microbenchmark
中,结果如下:
> microbenchmark(
GKi1 = apply(array(ozone, c(dim(ozone)[1:2], 12, dim(ozone)[3]/12), c(dimnames(ozone)[1:2], list(month=1:12, year=1995:2000))), 1:3, mean),
GKi2 = simplify2array(lapply(split(dimnames(plyr::ozone)[[3]], 1:12), \(x) apply(plyr::ozone[,,x], 1:2, mean))),
Grothendieck = apply(ozone, 1:2, month_mean),
times=100)
Unit: milliseconds
expr min lq mean median uq max neval
GKi1 21.67954 22.99889 25.73446 23.89190 27.26137 46.26843 100
GKi2 20.90931 22.90361 26.64572 23.88572 30.76128 45.16404 100
Grothendieck 40.98800 43.26854 49.51313 44.73214 52.28114 266.12759 100
最佳答案
您可以将时间维度划分为月份和年份,然后使用 apply
。
x <- plyr::ozone
x <- array(x, c(dim(x)[1:2], 12, dim(x)[3]/12),
c(dimnames(x)[1:2], list(month=1:12, year=1995:2000)))
#dim(x) <- c(dim(x)[1:2], 12, dim(x)[3]/12) #Alternative without names
. <- apply(x, 1:3, mean)
.[1,1,]
# 1 2 3 4 5 6 7 8
#264.6667 257.6667 255.0000 251.3333 257.6667 265.0000 274.0000 275.3333
# 9 10 11 12
#277.0000 285.0000 283.0000 273.3333
可以是另一种选择。
. <- simplify2array(lapply(split(dimnames(plyr::ozone)[[3]], 1:12), \(x)
apply(plyr::ozone[,,x], 1:2, mean)))
.[1,1,]
# 1 2 3 4 5 6 7 8
#264.6667 257.6667 255.0000 251.3333 257.6667 265.0000 274.0000 275.3333
# 9 10 11 12
#277.0000 285.0000 283.0000 273.3333
或者在 apply
中使用 tapply
(基于@g-grothendieck 的回答)
. <- apply(plyr::ozone, 1:2, tapply, rep(1:12, 6), mean)
.[,1,1]
#aperm(., c(2,3,1))[1,1,] #Alternative
# 1 2 3 4 5 6 7 8
#264.6667 257.6667 255.0000 251.3333 257.6667 265.0000 274.0000 275.3333
# 9 10 11 12
#277.0000 285.0000 283.0000 273.3333
在 apply
中使用 by
。
. <- apply(plyr::ozone, 1:2, by, rep(1:12, 6), mean)
.[,1,1]
# 1 2 3 4 5 6 7 8
#264.6667 257.6667 255.0000 251.3333 257.6667 265.0000 274.0000 275.3333
# 9 10 11 12
#277.0000 285.0000 283.0000 273.3333
如果速度很重要,可以使用 rowMeans
。
. <- rowMeans(`dim<-`(plyr::ozone, c(dim(plyr::ozone)[1:2], 12,
dim(plyr::ozone)[3]/12)), dims=3)
.[1,1,]
# [1] 264.6667 257.6667 255.0000 251.3333 257.6667 265.0000 274.0000 275.3333
# [9] 277.0000 285.0000 283.0000 273.3333
基准:
set.seed(42)
a <- array(runif(24 * 24 * 72), c(24, 24, 72))
bench::mark(check = FALSE, #Some have attr and have not the same order
applyDim = apply(`dim<-`(a, c(dim(a)[1:2], 12, dim(a)[3]/12)), 1:3, mean),
split = simplify2array(lapply(split(seq_len(dim(a)[3]), 1:12), \(x)
apply(a[,,x], 1:2, mean))),
applyTapply = apply(a, 1:2, tapply, rep_len(1:12, dim(a)[3]), mean),
applyBy = apply(a, 1:2, by, rep_len(1:12, dim(a)[3]), mean),
rowMeans = rowMeans(`dim<-`(a, c(dim(a)[1:2], 12, dim(a)[3]/12)), dims=3)
)
# expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc
# <bch:expr> <bch:tm> <bch:tm> <dbl> <bch:byt> <dbl> <int> <dbl>
#1 applyDim 25.5ms 29.2ms 33.4 864.33KB 41.2 17 21
#2 split 30.6ms 33.6ms 30.1 984.13KB 35.7 16 19
#3 applyTapply 36.2ms 38.8ms 22.6 2.52MB 35.9 12 19
#4 applyBy 177.1ms 179.1ms 5.56 2.71MB 35.2 3 19
#5 rowMeans 130.9µs 155.1µs 5149. 378.09KB 38.0 2575 19
关于r - 按月汇总多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72348326/
我怎样才能将 numberGrade 的值调高,如果它是 89.5,它会变成 90。numberGrade 被当作 double ,但将它设为 int 并不会向上或向下舍入。 public class
经过了漫长时间的移植和查询资料,得以解决一下嵌入式docker出现的问题,很多网上的资料全都是复制粘贴复制粘贴,找不到合适的解决方法让人很是苦恼,希望自己总结出的一些解决问题的经验给广大朋友减少一些
之前我是通过脚本来使用库的: 现在我使用 yarn 和 rollup 来构建带有下一个文件的项目。包.json: { "name": "maplib", "version": "1.0.0",
在 R 中,我正在尝试使用不同的窗口宽度对大向量(最多 400k 个元素)进行非常快速的滚动平均值,然后对于每个窗口宽度按每年的最大值汇总数据。下面的例子希望是清楚的。 我尝试了几种方法,到目前为止最
我想问一下我应该如何解决这个问题,因为我已经对这部分感到困惑和困惑。我已经使用这个命令全局安装了汇总 npm install --global rollup 但是,当我尝试运行“汇总”命令时,我应该期
我正在构建 javascript 库(更像是小部件),其中将包含一些 UI。我正在通过 javascript 向 DOM 添加 HTML 元素。要添加此 HTML,我有以下代码: async inse
我在显示一份报告时遇到了一些困难,该报告既可以将所有日期分组到月中,又可以对月中每天的“支出”求和。 我的 SQL 查询创建了这个:(检索所有日期) Date
我正在从事 Angular2 项目。我浏览了 Angular2 aot 文档并且能够生成 ngFactory 文件。我按照文档中的建议使用了 rollup js。我有一些非 es6 npm 包。我已经
我目前正在构建 Ionic 2-RC3 应用程序。但是自从我升级到 RC-1 后,我遇到了以下错误:(不确定它们是否保持不变,但你明白了)。 [15:16:17] rollup: Conflicti
Arabic, Egypt (ar_EG) -----------------------------阿拉伯语,埃及 Arabic, Israel (ar_IL) -----------------
我正在尝试汇总我的完全 es6 模块存储库,该存储库具有项目的本地导入/导出,以及对也是脚本或模块的依赖项的导入。 我也在尝试进行双重构建,通过汇总创建遗留的 iife 模块。 这仅适用于我的项目,没
我有一个由 DayTots 类对象组成的 VBA 集合(见下文) 我正在使用 For Each 遍历集合以创建一个 由汇总记录组成的新集合,基于日期 有什么方法可以用 Linq 做到这一点吗?我怀疑也
这是我第一次尝试理解/使用汇总。 我正在使用 this boilerplate因为它都是基于three.js,我也喜欢使用它。 到目前为止,我目前的(几乎肯定是不正确的)方法是: 从github下载样
我有两个 column_property 列,我想在 grandtotal 列中将它们加在一起。我希望能够根据 grandtotal 列进行排序和过滤。 如何对 subtotal 和 shipping
我收到以下错误消息: Error: Parse Error: Line 29: Unexpected token ILLEGAL 对应的代码行是 mobx 观察者装饰器: @observer clas
我真的坚持这一点,我真的很感激这方面的任何帮助。 目标是计算 Woocommerce 订单上每个类别中的项目数量,以便每个部分都可以以类别名称和产品数量为标题。例如: 汉堡 x 5 在此下方将是该订单
我正在从路由器收集传输数据;它提供每日,每月和每两分钟(间隔为120秒)的摘要。如果我在一天中(因此一个月中)重启路由器,则这些报告将不完整。但是,我仍然会得到间隔数据,并且可以对引导前后的记录进行汇
假设我有一个像这样的数据框: a b c d e f 1. 1 5 5 9 2 3 2. 4 7 3 1 4 6 3. 2 3 8 9
假设我有一个记录列表,我想通过取中位数来总结它。更具体地说,说我有 data Location = Location { x :: Double, y :: Double } 我有一个测量列表,我想将
我刚刚开始使用 AngularJS。我需要从 AngularJS 的书中升级这个购物车示例,以便所有 (items.price*item.quantity) 的总数显示在页面底部。实现它的推荐方法是什
我是一名优秀的程序员,十分优秀!