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