gpt4 book ai didi

r - 变量所有先验值的数学函数(例如,sd),按组

转载 作者:行者123 更新时间:2023-12-02 06:48:57 25 4
gpt4 key购买 nike

MWE。

library(data.table)
x <- data.table(
g=rep(c("x", "y"), each=4), # grouping variable
time=c(1,3,5,7,2,4,6,8), # time index
val=1:8) # value

setkeyv(x, c("g", "time"))

cumsd <- function(x) sapply(sapply(seq_along(x)-1, head, x=x), sd)

x[, cumsd(val), by=g]

## Output
# g V1
# 1: x NA
# 2: x NA
# 3: x 0.7071068
# 4: x 1.0000000
# 5: y NA
# 6: y NA
# 7: y 0.7071068
# 8: y 1.0000000

我想计算 R 中所有先验值(不包括当前值)的标准差(或更一般地说,数学函数),每个观察值,按组。

上面的 cumsd(“cumulative sd”)函数可以满足我的需要。例如第 3 行,V1 = sd(c(1, 2)),对应于第 1 行和第 2 行中的值。第 7 行,V1 = sd(c(5, 6)),对应第 5 行和第 6 行的值。

但是,cumsd 非常慢(在我的实际应用程序中使用速度太慢)。关于如何更有效地进行计算的任何想法?

编辑

对于 sd,我们可以使用 TTR 库中的 runSD,如下所述:Calculating cumulative standard deviation by group using R

下面 Gabor 的回答解决了先验值上任意数学函数的更一般情况。尽管普遍性可能会以效率为代价。

最佳答案

我们可以将窗口宽度指定为一个向量,然后在每次应用 sd 时省略窗口中的最后一个值。

library(zoo)

x[, sd:=rollapplyr(val, seq_along(val), function(x) sd(head(x, -1)), fill = NA), by = g]

给予:

> x
g time val sd
1: x 1 1 NA
2: x 3 2 NA
3: x 5 3 0.7071068
4: x 7 4 1.0000000
5: y 2 5 NA
6: y 4 6 NA
7: y 6 7 0.7071068
8: y 8 8 1.0000000

或者,我们可以在列表中指定偏移量。此处使用的负偏移量指的是先验值,因此 -1 是紧邻的先验值,-2 是之前的值,依此类推。

negseq <- function(x) -seq_len(x))
x[, sd:=rollapplyr(val, lapply(seq_along(val)-1, negseq), sd, fill = NA), by = g]

给予:

> x
g time val sd
1: x 1 1 NA
2: x 3 2 NA
3: x 5 3 0.7071068
4: x 7 4 1.0000000
5: y 2 5 NA
6: y 4 6 NA
7: y 6 7 0.7071068
8: y 8 8 1.0000000

关于r - 变量所有先验值的数学函数(例如,sd),按组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49966335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com