R - dplyr 滞后函数

R - dplyr lag function

我正在尝试计算几列滞后值之间的绝对差值。结果数据集的第一行是 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

如果有人能告诉我如何管理重命名步骤,那将是一个很棒的奖励,我玩过 paste 和 enquo。真实数据集太长,无法使用 gather/newcolumnname/spread 方法。

提前致谢!

编辑:图书馆需要 运行 添加脚本

也许是这样的:

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

然后对您感兴趣的所有列执行此操作

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

关于您的加分问题,已提供答案

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

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

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