如何在R的lapply中正确提取数据框原名并重命名列?
解决方案:正确提取列表中DataFrame的名称并重命名列
问题原因
你用deparse(substitute(x))无法获取列表中DataFrame的原始名称,是因为lapply的匿名函数里,x只是列表元素的临时引用,不是原始对象名,所以会返回x[[i]]这类内部标识。
可行方案
方案1:用purrr::imap(推荐)
imap会同时传递列表的元素和元素名称,直接就能拿到每个DataFrame的原始名称:
library(purrr) library(dplyr) library(tidyr) df_list <- imap(df_list, function(x, df_name){ lookup <- c(start = paste(df_name, "_start"), end = paste(df_name, "_end"), top = paste(df_name, "_top"), left = paste(df_name, "_left"), height = paste(df_name, "_height"), width = paste(df_name, "_width"), type = paste(df_name, "_type"), value = paste(df_name, "_value")) x <- x %>% rename_with(.fn = ~lookup[.x], .cols = intersect(names(.), names(lookup))) %>% arrange(creativeId) %>% select(-1) %>% distinct() %>% mutate(counter = with(., ave(creativeId, with(rle(creativeId), rep(seq_along(values), lengths)), FUN = seq_along))) %>% relocate(counter) %>% pivot_wider(names_from = counter, values_from = -names(.)[1:2]) }) new_df <- Reduce(function(x,y) merge(x,y,all=TRUE), df_list)
方案2:基础R遍历列表名称
如果不想依赖purrr包,直接遍历列表的名称,通过名称索引对应DataFrame:
df_names <- names(df_list) df_list <- lapply(df_names, function(df_name){ x <- df_list[[df_name]] lookup <- c(start = paste(df_name, "_start"), end = paste(df_name, "_end"), top = paste(df_name, "_top"), left = paste(df_name, "_left"), height = paste(df_name, "_height"), width = paste(df_name, "_width"), type = paste(df_name, "_type"), value = paste(df_name, "_value")) x <- x %>% rename_with(.fn = ~lookup[.x], .cols = intersect(names(.), names(lookup))) %>% arrange(creativeId) %>% select(-1) %>% distinct() %>% mutate(counter = with(., ave(creativeId, with(rle(creativeId), rep(seq_along(values), lengths)), FUN = seq_along))) %>% relocate(counter) %>% pivot_wider(names_from = counter, values_from = -names(.)[1:2]) }) # 可选:恢复列表名称,方便后续查看 names(df_list) <- df_names new_df <- Reduce(function(x,y) merge(x,y,all=TRUE), df_list)
注意事项
- 确保你的
df_list是带命名的列表,如果没有命名,先手动添加:names(df_list) <- c("df1", "df2", ...)(替换为你的DataFrame实际名称)。
内容的提问来源于stack exchange,提问作者Jess
相关产品推荐
相关产品推荐

