R - dplyr滞后函数

时间:2017-10-02 15:58:52

标签: r dplyr lag names

我试图计算几列上滞后值之间的绝对差值。结果数据集的第一行是NA,这是正确的,因为没有先前的值来计算滞后。我不明白为什么不计算最后一个值的滞后。请注意,下面示例中的最后一个值(temp)是第二个到最后一个值和第三个到最后一个值之间的滞后,缺少最后一个和倒数第二个值之间的滞后值。

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

如果有人能告诉我如何管理重命名步骤,那将是一个很棒的奖励,我玩了粘贴和enquo。真实数据集太长,无法进行收集/新列名称/传播方法。

提前致谢!

编辑:库需要运行添加的脚本

3 个答案:

答案 0 :(得分:2)

我认为现有代码中的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>

答案 1 :(得分:0)

也许是这样的:

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

然后对您感兴趣的所有列

执行此操作

答案 2 :(得分:0)

我无法重现您关于滞后功能的问题。当我执行您的示例代码时,我检索一个由31行组成的数据框,正如您所提到的那样,第一行不是NA,它已经是第1行的减法第二排。

关于您的红利问题,答案是here

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

这应该会产生所需的列命名。