【问题标题】:R ddply catch errorsR ddply 捕获错误
【发布时间】:2019-06-22 06:12:48
【问题描述】:

我正在尝试在具有多个组的数据帧上运行一些移动平均线。我对每组 20 个系列中的最后一个 SMA 感兴趣。下面的第二个示例崩溃,因为一个系列 (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]

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    您想要的是来自purrr 库的possibly

    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
    

    【讨论】:

      【解决方案2】:

      发生这种情况是因为您使用了 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
      

      这是否给你正确的结果,取决于你在寻找什么。

      【讨论】:

      • 感谢您的回复。我对 SMA30 感兴趣,所以 C 股没有 SMA30,因此应该是 NA。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      相关资源
      最近更新 更多