R ddply捕获错误

时间:2019-06-22 06:12:48

标签: r plyr

我正在尝试对具有多个组的数据框进行一些移动平均。我对最后一组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]

干杯, 卢克

2 个答案:

答案 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

这是否给您正确的结果,取决于您要寻找的东西。