отставание от значения столбца - PullRequest
0 голосов
/ 28 августа 2018

Можно ли использовать значения столбца как n в функции dplyr :: lag ?

Воспроизводимый пример:

DF <- data.frame(
    V = runif(1000, min=-100, max=100), 
    nlag = as.integer(runif(1000, min=1, max=10))
) %>% 
mutate(Vlag = lag(V, n = nlag))

Я получаю эту ошибку:

Ошибка: ошибка оценки: n должен быть неотрицательным целочисленным скаляром, а не целым числом длины 1000.

Есть ли другая альтернатива?

Обновление:

Как мы решаем одну и ту же проблему в группах?

Воспроизводимый пример:

DF <- data.frame(
    V = runif(1000, min=-100, max=100),
    nlag = as.integer(runif(1000, min=1, max=10)),
    type = sample(1:4, replace=TRUE)
) %>%
group_by(type) %>% 
mutate(Vlag = lag(V, n = nlag))

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

nlag должен иметь длину 1, попробуйте что-то вроде этого:

DF <- data.frame(
  V = runif(1000, min=-100, max=100), 
  nlag = as.integer(runif(1000, min=1, max=10))
) %>%  mutate(Vlag = V[if_else((row_number() - nlag) < 1, as.integer(NA), row_number() - nlag)])
                V nlag         Vlag
1     -6.72598341    4           NA
2    -84.67472238    2           NA
3     -4.98048104    7           NA
4      2.64957272    4           NA
5     82.16284532    4  -6.72598341
6     28.93483448    9           NA
7     88.16730371    3   2.64957272
8     42.31721302    7  -6.72598341
9    -38.12659876    1  42.31721302
10    74.62628153    3  88.16730371
...
0 голосов
/ 28 августа 2018

Другой вариант - использование пакета purrr. map2_dbl принимает два вектора (или списки) одинаковой длины в качестве входных данных и выполняет итерации по ним одновременно. Затем возвращается double. Внутри map -колокола lag из V вычисляется с указанным nlag, а затем возвращается только текущая строка.

library(dplyr)
library(purrr)

DF %>% 
  mutate(Vlag = map2_dbl(nlag, row_number(), ~ lag(V, n = .x)[.y]))

# A tibble: 20 x 3
#         V  nlag  Vlag
#     <dbl> <int> <dbl>
#  1  83.0      9  NA  
#  2  87.4      2  NA  
#  3 -42.8      9  NA  
#  4  66.1      9  NA  
#  5  28.3      1  66.1
#  6   3.82     5  83.0
#  7  47.3      4 -42.8
#  8 -73.1      9  NA  
#  9  31.4      5  66.1
# 10  41.0      8  87.4
# ...

Данные
При использовании случайных чисел в качестве примера вы должны указать начальное число. Также в этом случае меньшее количество строк достаточно, чтобы показать проблему.

set.seed(42)
DF <- tibble(V = runif(20, min=-100, max=100), 
             nlag = as.integer(runif(20, min=1, max=10))) 
0 голосов
/ 28 августа 2018

В документации на ?lag написано

п
положительное целое число длины 1, дающее число позиций для опережения или отставания на

Так что невозможно дать любое число больше length = 1.

Однако мы можем сгенерировать индекс для получения значения V, вычитая текущий индекс строки с соответствующим значением nlag, а затем мы используем этот индекс для получения отстающего значения V.

df$lag_value <- sapply(seq_along(df$nlag), function(x) {
      indx = x - df$nlag[x]
     if(indx > 0)
        df$V[indx]
     else
        NA
})
df

#          V nlag lag_value
#1  51.30453    6        NA
#2 -66.33709    4        NA
#3  95.45096    9        NA
#4  44.54434    3  51.30453
#5  62.00180    3 -66.33709
#6 -18.43012    4 -66.33709

Обновление

Если мы хотим сделать это по группам, мы можем разделить их по столбцу type и применить ту же операцию.

df$lag_value <- unlist(lapply(split(df, df$type), function(x) 
        sapply(seq_along(x$nlag), function(y) {
          indx = y - x$nlag[y]
          if(indx > 0)
            x$V[indx]
          else
             NA
})))

Данные

df <- head(DF)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...