R - функция задержки dplyr

Я пытаюсь вычислить абсолютную разницу между запаздывающими значениями по нескольким столбцам. Первая строка результирующего набора данных - это NA, что верно, поскольку нет предыдущего значения для вычисления задержки. Я не понимаю, почему задержка не рассчитывается для последнего значения. Обратите внимание, что последнее значение в приведенном ниже примере (temp) - это задержка между 2-м и последним и 3-м последним значениями, значение задержки между последним и 2-м и последним значениями отсутствует.

library(tidyverse)
library(purrr)
dim(mtcars) # 32 rows
temp <- map_df(mtcars, ~ abs(diff(lag(.x))))
names(temp) <- paste(names(temp), '.abs.diff.lag', sep= '') 
dim(temp) # 31 rows

Было бы отличным бонусом, если бы кто-нибудь мог показать мне, как выполнить этап переименования, я поигрался с paste и enquo. Реальный набор данных слишком длинный для использования метода сбора / нового имени столбца / распространения.

Заранее спасибо!

РЕДАКТИРОВАТЬ: библиотеки должны запускать добавленный скрипт


person RoseS    schedule 02.10.2017    source источник
comment
Использование lag и diff вместе, вероятно, не дает того, что вы думаете. lag(x, lag=1) возвращает x [n-1], diff(x) возвращает x[n] - x[n-1].   -  person Mako212    schedule 02.10.2017


Ответы (3)


Я думаю, что вызов lag в вашем существующем коде не нужен, поскольку diff автоматически вычисляет запаздывающую разницу (хотя, возможно, я не совсем понимаю, что вы пытаетесь сделать). Вы также можете использовать rename_all, чтобы добавить суффикс ко всем именам переменных.

library(purrr)
library(dplyr)
mtcars %>%
  map_df(~ abs(diff(.x))) %>%
  rename_all(funs(paste0(., ".abs.diff.lag")))
#> # A tibble: 31 x 11
#>    mpg.abs.diff.lag cyl.abs.diff.lag disp.abs.diff.lag hp.abs.diff.lag
#>               <dbl>            <dbl>             <dbl>           <dbl>
#>  1              0.0                0               0.0               0
#>  2              1.8                2              52.0              17
#>  3              1.4                2             150.0              17
#>  4              2.7                2             102.0              65
#>  5              0.6                2             135.0              70
#>  6              3.8                2             135.0             140
#>  7             10.1                4             213.3             183
#>  8              1.6                0               5.9              33
#>  9              3.6                2              26.8              28
#> 10              1.4                0               0.0               0
#> # ... with 21 more rows, and 7 more variables: drat.abs.diff.lag <dbl>,
#> #   wt.abs.diff.lag <dbl>, qsec.abs.diff.lag <dbl>, vs.abs.diff.lag <dbl>,
#> #   am.abs.diff.lag <dbl>, gear.abs.diff.lag <dbl>,
#> #   carb.abs.diff.lag <dbl>
person markdly    schedule 02.10.2017
comment
Я использовал задержку из библиотеки dplyr, чтобы получить первую строку, которую нужно заполнить как NA, в надежде, что количество строк останется таким же, как в исходном наборе данных (для целей слияния), но в нем отсутствует последняя строка. Без запаздывания он действует так же, как stats :: lag, и оставляет первую строку NA. Спасибо за подсказку rename_all, работает хорошо! - person RoseS; 02.10.2017
comment
@RoseS, вы можете сделать это map_df(~ abs(c(NA, diff(.x)))), чтобы вернуть то же количество строк, что и исходное, с первой строкой NA. - person markdly; 02.10.2017
comment
Ах, да! Это идеально. Большое спасибо! - person RoseS; 02.10.2017

Может быть, примерно так:

dataCars <- mtcars%>%mutate(diffMPG = abs(mpg - lag(mpg)), 
                        diffHP = abs(hp - lag(hp)))

А затем проделайте это для всех интересующих вас столбцов.

person DataTx    schedule 02.10.2017
comment
Спасибо за предложение, с множеством столбцов я надеюсь придерживаться map_df, sapply или чего-то подобного. Спасибо! - person RoseS; 02.10.2017

Мне не удалось воспроизвести ваши проблемы с функцией задержки. Когда я выполняю ваш пример кода, я извлекаю фрейм данных, состоящий из 31 строки, точно так, как вы упомянули, но первая строка не NA, это уже вычитание 1-й и 2-й строк.

Что касается вашего вопроса о бонусе, ответ предоставляется здесь:

temp <- map_df(mtcars, ~ abs(diff(lag(.x)))) %>% setNames(paste0(names(.), '.abs.diff.lag'))

Это должно привести к желаемому названию столбца.

person Martin    schedule 02.10.2017
comment
Большое спасибо, Мартин! Я играл с setNames и не придумал эту комбинацию. Это очень ценится. Понятия не имею, почему мы получаем разные результаты, я даже перезапустил R, поэтому были прикреплены только tidyverse и purrr, и я по-прежнему получаю те же результаты, которые описал выше - person RoseS; 02.10.2017
comment
Похоже, что stats :: lag дает результаты, которые вы описываете, dplyr :: lag дает результаты, которые я описал. Я хотел бы получить комбинацию из обоих результатов, чтобы я мог объединить новые переменные в свой исходный набор данных. Спасибо! И, пожалуйста, дайте мне знать, если у вас есть еще какие-либо мысли :) - person RoseS; 02.10.2017