You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 08:35:23