我有各种列的数据框。我需要计算特定列Spread
的标准偏差。标准偏差应出现在另一栏中。
标准偏差应从第20行开始计算,直到数据框的最后一行。这意味着第20行的标准偏差应该是前20个值的标准偏差。在第21行,标准偏差应该是第2行到第21行的数据,依此类推。
虽然有很多关于标准偏差计算的帖子,但我找不到与我相关的帖子。谢谢你的帮助。
答案 0 :(得分:5)
使用rollapply
包
zoo
功能
library(zoo)
rollapply(data = dat$Spread,width=20,FUN=sd)
答案 1 :(得分:3)
使用此功能:
rollingSD <- function(x, h = 5) {
if (is.numeric(x) && length(x) >= h && h > 0) {
c(numeric(h-1), sapply(1:(length(x)-h+1), function(i) sd(x[i:(i+h-1)])))
}
}
它对输入向量x
应用滚动标准偏差,窗口大小为h
。在您的情况下,您应该通过h = 20
。
<强>实验强>
set.seed(0); r <- rnorm(10)
# [1] 1.262954285 -0.326233361 1.329799263 1.272429321 0.414641434
# [6] -1.539950042 -0.928567035 -0.294720447 -0.005767173 2.404653389
rollingSD(r, h = 5)
# [1] 0.0000000 0.0000000 0.0000000 0.0000000 0.7305264 1.2012939 1.2973930
# [8] 1.1045270 0.7719939 1.5063519
如果您的数据框被称为dat
,那么您可以这样做:
dat$sd <- rollingSD(dat$Spread, h = 20)
这会将rollingSD
应用于窗口大小为20的列Spread
,并将结果保存到新列sd
。
答案 2 :(得分:2)
我们可以使用roll_sd
中的RcppRoll
(来自@ ZheyuanLi的帖子的数据)
library(RcppRoll)
roll_sd(r, 5, fill=0, align = "right")
#[1] 0.0000000 0.0000000 0.0000000 0.0000000 0.7305264 1.2012939 1.2973930
#[8] 1.1045270 0.7719939 1.5063519
答案 3 :(得分:1)
这是一个使用for循环的简化玩具示例。假设a
中的列df
包含您的数据。让我们计算前3个值的标准差,然后计算值2到4,等等。您可以根据自己的需要进行修改。然后,您可以将sd添加到数据框df
中的新列。
a <- c(10,100,1000,10000,100000)
df <- as.data.frame(a)
b <- c(NA, NA)
for (i in 3:NROW(df)){
b <- c(b, sd(c(df$a[ c((i-2):i)] )))}
df$b <- b
df
# a b
#1 1e+01 NA
#2 1e+02 NA
#3 1e+03 547.4486
#4 1e+04 5474.4863
#5 1e+05 54744.8628
请注意,在第一步中,我们将NAs
添加到b
;因为前三个值的sd位于df
的第3行。
或者,设置窗口大小w
并在for loop
中使用。现在,每次更改窗口大小时都不必修改整个脚本。
w = 3
b <- c(rep(NA, w-1))
for (i in w:NROW(df)){
b <- c(b, sd(c(df$a[ c((i-(w-1)):i)] )))}
df$b <- b
您也可以创建一个功能。
roll_sd <- function(string, window){
b <- c(rep(NA, window-1))
for (i in window:NROW(df)){
b <- c(b, sd(c(df$a[ c((i-(window-1)):i)] )))}
return(b)}
使用玩具示例尝试该功能。
roll_sd(df$a, 3)
#[1] NA NA 547.4486 5474.4863 54744.8628