首页 > 解决方案 > 使用 for 循环在 R 中转换列名

问题描述

我正在尝试使用 for loop c("2000", "2001",..., "2011") 来重写以下代码。每个数据帧包括变量“emp_01”、“emp_02”等。为了区分这些变量,我想使用后缀“emp_01.2000”、“emp_02.2000”并将“fips”转换为合并。您能告诉我在这种情况下如何编写 for 循环吗?

colnames(df_2000) <- paste(colnames(df_2000), "2000", sep = ".")
df_2000  <-  df_2000 %>%
   rename(fips = fips.2000)
colnames(df_2001) <- paste(colnames(df_2001), "2001", sep = ".")
df_2001  <-  df_2001 %>%
   rename(fips = fips.2001)
...

标签: rfor-looppaste

解决方案


我们可以mget用来获取 a 中的对象list,然后更改值

library(dplyr)
library(purrr)
library(stringr)
lst1 <- mget(ls(pattern = '^df_\\d{4}$')) %>%
       map(~ .x %>%
          rename_at(vars(starts_with('fips')), ~ str_remove(., '\\.\\d{4}$'))) 

最好将对象保留在列表中,而不是更新原始对象。但是,如果我们需要

list2env(lst1, .GlobalEnv)

如果我们需要加入所有list元素

reduce(lst1, full_join, by = 'fips')

或者,如果我们考虑将所有数据集data.framelist另一个数据集“pop”连接起来

map(lst1, ~ full_join(.x, pop, by = 'fips'))

推荐阅读