我试图计算几列上滞后值之间的绝对差值。结果数据集的第一行是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。真实数据集太长,无法进行收集/新列名称/传播方法。
提前致谢!
编辑:库需要运行添加的脚本
答案 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'))
这应该会产生所需的列命名。