我想计算从第一个到最后一个观察的一列中每4个值的标准偏差。我已经找到了许多移动SD函数的答案,但我只需要一行代码来计算每4个数据值的sd()
,并将答案写入数据框中的新列,如下所示:
示例数据:
Obs Count
1 56
2 29
3 66
4 62
5 49
6 12
7 65
8 81
9 73
10 66
11 71
12 59
期望的输出:
Obs Count SD
1 56 16.68
2 29 16.68
3 66 16.68
4 62 16.68
5 49 29.55
6 12 29.55
7 65 29.55
8 81 29.55
9 73 6.24
10 66 6.24
11 71 6.24
12 59 6.24
我尝试了以下代码,但这显然是不正确的:
a <- for(i in 1: length(df)) sd(df$Count[i:(i+3)])
这应该是一项非常简单的任务,但我找不到答案。我还在学习,任何帮助都会受到赞赏。
答案 0 :(得分:7)
在基础R中,您可以使用以下内容创建“每4行”的索引:
(seq_len(nrow(mydf))-1) %/% 4
# [1] 0 0 0 0 1 1 1 1 2 2 2 2
使用它,您可以使用ave
来获得所需的结果:
mydf$SD <- ave(mydf$Count, (seq_len(nrow(mydf))-1) %/% 4, FUN = sd)
mydf
# Obs Count SD
# 1 1 56 16.680827
# 2 2 29 16.680827
# 3 3 66 16.680827
# 4 4 62 16.680827
# 5 5 49 29.545163
# 6 6 12 29.545163
# 7 7 65 29.545163
# 8 8 81 29.545163
# 9 9 73 6.238322
# 10 10 66 6.238322
# 11 11 71 6.238322
# 12 12 59 6.238322
答案 1 :(得分:4)
另一种方法是使用动物园包中的rollapply
与rep
结合使用。
> library(zoo)
> N <- 4 # every four values
> SDs <- rollapply(df[,2], width=N, by=N, sd)
> df$SD <- rep(SDs, each=N)
> df
Obs Count SD
1 1 56 16.680827
2 2 29 16.680827
3 3 66 16.680827
4 4 62 16.680827
5 5 49 29.545163
6 6 12 29.545163
7 7 65 29.545163
8 8 81 29.545163
9 9 73 6.238322
10 10 66 6.238322
11 11 71 6.238322
12 12 59 6.238322
您可能想要一次性完成所有操作:
df$SD <- rep( rollapply(df[,2], width=N, by=N, sd), each=N)
答案 2 :(得分:2)
这看起来更快(我没有测试强硬):
# mydf = your data
idxs = rep(1:nrow(mydf), each = 4, length = nrow(mydf))
mydf = within(mydf, {
Sd = rep(tapply(Count, idxs, sd), each = 4)
})
print(mydf)