如何根据 dplyr 管道中另一列的第一行的值重命名列

How to rename column based on value of the first row of another column in dplyr pipe

我有一长串不同的过滤和选择函数,在同一个管道操作中,我想根据另一列第一行的值重命名一列。我必须为许多不同的数据框执行此操作,因此与数据框名称无关的管道会很好。

这是一个小例子:

original <- tibble(value = c(1,2,4,6,7), month = 1:5, year = 2018)
what_I_want <- tibble(indicator2018 = c(1,2,4,6,7), month = 1:5, year = 2018)

因此,如果第 year 列的第一行是 2015,则值的列名称将更改为 indicator2015

这行不通:

original %>%
  rename(paste0("indicator", .$year[1]) = "value")

original %>%
  rename_at(vars(starts_with("value")), list( ~ str_replace(., "value", paste0("indicator", .["year"][1]))))

这可行,但涉及破坏管道,并且(更重要的是)需要管道中数据框的名称,因此如果不手动更改代码就无法扩展到许多不同的数据框。

original2 <- original %>%
  rename_at(vars(starts_with("value")), list( ~ str_replace(., "value", paste0("indicator", original$year[1]))))

您需要取消引用。这有效:

original %>% 
  rename(!!paste0("indicator", .$year[1]) := "value")

为了将来参考,我建议您查看 "programming with dplyr" 插图 (https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html).