首页 > 解决方案 > 根据对自身的引用改变多个新列

问题描述

一个数据框:

df <- data.frame(
  date = seq(ymd('2021-01-01'), ymd('2021-01-31'), by = 1),
  ims_x = rnorm(31, mean = 0),
  ims_y = rnorm(31, mean = 1),
  ims_z = rnorm(31, mean = 2),
  blah = 1:31
)

我想改变 3 个新字段(不覆盖),“ims_x_lagged”、“ims_y_lagged”和“ims_z_lagged”,其中每个新字段对应于原始字段,但滞后一天/行。新字段的名称只会在原始名称上附加“_lagged”,并且值将更改为前一行中的原始名称。

我可以为每个字段手动执行此操作,但这将需要大量输入,而且我的真实数据有超过 3 个需要滞后的字段。

有点像这样,如果有可能告诉我想要做什么:

df <- df %>% 
  mutate_at(vars(contains('ims_')) := lag(vars(contains('ims_')))) # but append '_lagged' to the name

标签: r

解决方案


随着新版本dplyr的. 如果我们不指定,它将用相同的列名替换修改后的列值。通过指定,- 返回原始列名,并且可以添加前缀或后缀作为字符串。_at_allacross.names.names{.col}

library(dplyr)
df <- df %>%
     mutate(across(starts_with('ims'), lag, .names = "{.col}_lagged"))

推荐阅读