R语言 重命名列表内各dataframe第一列并拼接其名称作为后缀
问题原因
- 你在
lapply的匿名函数中调用names(x)时,x是列表内的单个dataframe,此时names(x)取的是该dataframe的列名(也就是示例中的"a"),而非该元素在列表中对应的自定义名称。 - 匿名函数没有返回修改后的dataframe对象:
colnames(x) = xxx赋值语句的返回值是新的列名字符向量,运行你的代码后my_list会变成存储列名字符串的列表,而非存储修改后dataframe的列表。
正确实现方案
方案1:Base R实现
# 同时遍历列表元素和对应的名称 my_list <- Map(function(df, df_name) { # 仅将名为a的列重命名,避免影响其他列 colnames(df)[colnames(df) == "a"] <- paste0("a_", df_name) return(df) }, my_list, names(my_list)) # 如果需要将修改后的dataframe同步到全局环境,运行下面的代码即可 list2env(my_list, envir = .GlobalEnv)
方案2:purrr包实现(更简洁)
library(purrr) # imap可以自动获取列表元素的名称作为第二个参数.y my_list <- imap(my_list, ~{ colnames(.x)[colnames(.x) == "a"] <- paste0("a_", .y) return(.x) }) # 同步到全局环境 list2env(my_list, envir = .GlobalEnv)
运行后查看green、yellow等对象,即可得到符合要求的列名格式。
内容的提问来源于stack exchange,提问作者Alberto Pascale
相关产品推荐
相关产品推荐

