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

时间:2019-10-28 10:53:41

标签: r dplyr pipe magrittr

我有很长的管道,具有不同的过滤和选择功能,并且在相同的管道操作中,我想根据另一列的第一行中的值重命名一列。我必须对许多不同的数据帧执行此操作,因此与数据帧名称无关的管道会很好。

这是一个小例子:

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年,那么value的列名称将更改为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]))))

1 个答案:

答案 0 :(得分:4)

您需要取消报价。这有效:

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

为将来参考,我建议您查看“用dplyr编程” 小插图(https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html)。