我正在尝试对具有多个组的数据框进行一些移动平均。我对最后一组SMA感兴趣,每组20个。下面的第二个示例崩溃,因为一个系列(C)只有10个值。我需要做些什么才能使它不崩溃? C需要保留在结果中。我很高兴C在结果中成为NA。
df <- data.frame(x=c(rep("A", 30), rep("B", 30),rep("C", 10)), y=rnorm(n = 70, 100, 20))
df
ddply(df, .(x), summarise, SMA10= tail(SMA(y, n=10), 1)) # Works because all groups have at least 10 values
ddply(df, .(x), summarise, SMA10= tail(SMA(y, n=20), 1)) # Does not work
Error in runSum(x, n) : n = 20 is outside valid range: [1, 10]
干杯, 卢克
答案 0 :(得分:1)
您想要的是possibly
库中的purrr
。
library(purrr)
ddply(df, .(x), summarise, SMA10= tail(possibly(SMA, otherwise = NA)(y, n=20), 1))
x SMA10
1 A 101.7075
2 B 91.9557
3 C NA
答案 1 :(得分:0)
发生这种情况是因为您使用了SMA()函数:
library(TTR)
df <- data.frame(x=c(rep("A", 30), rep("B", 30),rep("C", 10)), y=rnorm(n = 70, 100, 20))
SMA(df$y[df$x=="C"], n=20)
#Error in runSum(x, n) : n = 20 is outside valid range: [1, 10]
如果您查看SMA()
函数的文档,则会看到:
x:对xts或矩阵具有强制性的价格,数量等系列。
n:平均周期数。必须介于1和nrow(x)之间, 包括在内。
因此,您首先需要确保您的组中至少有n
(在您情况下为n=20
)个元素。
根据您的操作,可以使用min()函数在SMA()函数中设置n(),即:
ddply(df, .(x), summarise, SMA10= tail(SMA(y, n=min(20,length(y))), 1))
x SMA10
#1 A 92.03348
#2 B 99.68643
#3 C 89.62087
这是否给您正确的结果,取决于您要寻找的东西。