Ошибка выхода за пределы границ из-за передачи mutate (dplyr) матрицы - PullRequest
2 голосов
/ 05 ноября 2019

Мне нужно применить функцию прокрутки к большому набору данных, но она должна применяться к сгруппированным окнам, указанным в group_by. Передача функции в mutate возвращает ошибку «индекс за пределами» для некоторых подмножеств данных, но работает для других. Я не могу предоставить свои данные, поскольку они являются конфиденциальными, но я нашел достаточно похожий воспроизводимый пример.

Я попытался отследить ошибку, из-за которой я понял, что это связано с функцией, возвращающей матричный тип данных (1d). Приведение его к датафрейму или вектору не сработало.

library(tidyverse)
library(caTools)

# Works
i <- iris %>%
  group_by(Species)%>% 
  arrange(Sepal.Length,.by_group=T)%>%
  mutate(q_low = runquantile(lag(Sepal.Length),3,probs=0.2,endrule = 'NA',align='right'))

# Gives error 
# Grouping by and arranging by more than one variable
m <- mtcars %>%
  group_by(cyl,gear)%>% 
  arrange(gear,.by_group=T)%>%
  mutate(q_low = runquantile(lag(drat),3,probs=0.2,endrule = 'NA',align='right'))
#> Error in `[<-`(`*tmp*`, (k2 + 1):n, , value = y[1:(n - k2), ]): subscript out of bounds

Создано в 2019-11-05 пакетом Представить (v0.3.0)

Ожидаемый результат, аналогичный IrisПример с функцией, применяемой к группировке и NA в правильном месте. На самом деле я получаю ошибку.

1 Ответ

1 голос
/ 05 ноября 2019

в первом примере все группы имеют количество строк, равное 50, но во втором случае это не так, некоторые из них имеют число строк равное 1.

runquantile(rnorm(4), 3, probs =0.2, endrule = 'NA',align='right')
#[1]         NA         NA -0.5466295 -0.4099716

вышеработает, но если количество элементов меньше, чем 'k'

runquantile(rnorm(1), 3, probs =0.2, endrule = 'NA',align='right') 

Ошибка в [<- (*tmp*, (k2 + 1): n, значение = y [1: (n - k2),]):
индекс вне границ


Нам нужно позаботиться о тех случаях с if/else условием

library(dplyr)
library(caTools)
mtcars %>%
  group_by(cyl,gear)%>% 
  arrange(gear,.by_group=TRUE) %>% 
  mutate(q_low = if(n() < 3) NA_real_ else 
      runquantile(lag(drat),3,probs=0.2,endrule = 'NA',align='right'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...