R ddply ловить ошибки - PullRequest
       14

R ddply ловить ошибки

2 голосов
/ 22 июня 2019

Я пытаюсь запустить скользящие средние по фрейму данных с несколькими группами.Я заинтересован в последнем SMA из серии 20 для каждой группы.Второй пример ниже дает сбой, потому что одна серия (C) имеет только 10 значений.Что мне нужно сделать, чтобы это не вылетело?С нужно сохранить в результате.Я рад, что 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 ]

1 голос
/ 22 июня 2019

То, что вы хотите, это 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
0 голосов
/ 22 июня 2019

Это происходит из-за используемой вами функции 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 () для установки n () в функции SMA (), то есть:

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

Дает ли это правильный результат или нет, зависит отчто вы ищете.

...