如何为全局环境中的所有dataframe添加自定义列?
问题描述
我在全局环境中有多个DataFrame(df1、df2、df3……dfn),示例数据如下:
df1 <- data.frame(a=1:3, b=1:3, d=1:3, e=1:3) df2 <- data.frame(a=1:3, b=1:3, d=1:3, e=1:3) df3 <- data.frame(a=1:3, b=1:3, d=1:3, e=1:3) # df1 # df2 # df3 # a b d e # a b d e # a b d e # 1 1 1 1 # 1 1 1 1 # 1 1 1 1 # 2 2 2 2 # 2 2 2 2 # 2 2 2 2 # 3 3 3 3 # 3 3 3 3 # 3 3 3 3
我想通过循环或函数,为所有这些DataFrame添加一列名为code的新列,列值对应各自DataFrame的名称,最终效果如下:
# df1 df2 df3 # a b d e code # a b d e code # a b d e code # 1 1 1 1 df1 # 1 1 1 1 df2 # 1 1 1 1 df3 # 2 2 2 2 df1 # 2 2 2 2 df2 # 2 2 2 2 df3 # 3 3 3 3 df1 # 3 3 3 3 df2 # 3 3 3 3 df3
实现思路与代码
方法一:循环遍历处理
先筛选全局环境中所有DataFrame的名称,再逐个修改并更新回全局环境:
# 筛选全局环境中所有DataFrame的名称 df_names <- ls(envir = .GlobalEnv)[sapply(ls(envir = .GlobalEnv), function(x) is.data.frame(get(x)))] # 循环处理每个DataFrame for (name in df_names) { current_df <- get(name, envir = .GlobalEnv) current_df$code <- name assign(name, current_df, envir = .GlobalEnv) }
方法二:批量函数处理
用eapply或lapply批量操作,减少循环的冗余代码:
# 批量识别并修改DataFrame lapply(ls(envir = .GlobalEnv), function(x) { obj <- get(x) if (is.data.frame(obj)) { obj$code <- x assign(x, obj, envir = .GlobalEnv) } })
或者更简洁的写法:
# 提取并处理所有DataFrame processed_dfs <- eapply(.GlobalEnv, function(obj, name) { if (is.data.frame(obj)) { obj$code <- name obj } }, name = ls(.GlobalEnv)) # 将处理后的结果放回全局环境 list2env(processed_dfs, envir = .GlobalEnv)
内容的提问来源于Stack Exchange,提问作者Bartholomew
相关产品推荐
相关产品推荐

