如何在R中根据输入DataFrame名称命名输出回归结果对象
问题:让回归结果对象名称与输入DataFrame名称对应
我需要对多个DataFrame进行回归建模,希望输出的结果对象名称能和输入的DataFrame名称一一对应,但当前代码生成的结果名是带数字后缀的格式,想改成包含原DataFrame名称的命名方式。
当前代码
list.dfs <- list(BrC15sy_h16_d_EE86228,BrC15sy_h16_d_EE86235,BrC15sy_h16_d_EE86256, BrC15sy_h16_d_EE86257,BrC15sy_h16_d_EE86267,BrC15sy_h16_d_EE86269) for (i in 1:length(list.dfs)){ lm.res <- lm( as.formula(paste(colnames(list.dfs[[i]])[1], "~ .")), data=list.dfs[[i]] ) assign(paste0("lm_Res",i), lm.res, envir = .GlobalEnv) }
当前输出结果对象名称
lm_Res1 lm_Res2 lm_Res3 lm_Res4 lm_Res5 lm_Res6
期望输出结果对象名称
lm_Res_BrC15sy_h16_d_EE86228 lm_Res_BrC15sy_h16_d_EE86235 lm_Res_BrC15sy_h16_d_EE86256 lm_Res_BrC15sy_h16_d_EE86257 lm_Res_BrC15sy_h16_d_EE86267 lm_Res_BrC15sy_h16_d_EE86269
解决方案
核心问题是原始的list()只存储了DataFrame的内容,没有保留原对象名称。可以通过以下两种方式解决:
方法1:用mget自动获取对象并保留名称
mget可以根据对象名从全局环境中获取数据,同时自动将对象名设为list的元素名称,后续循环时直接使用这些名称生成结果对象名:
# 定义所有目标DataFrame的名称 df_names <- c("BrC15sy_h16_d_EE86228", "BrC15sy_h16_d_EE86235", "BrC15sy_h16_d_EE86256", "BrC15sy_h16_d_EE86257", "BrC15sy_h16_d_EE86267", "BrC15sy_h16_d_EE86269") # 获取DataFrame并生成带名称的list list.dfs <- mget(df_names) # 遍历list的元素名称(即原DataFrame名称) for (df_name in names(list.dfs)) { lm.res <- lm( as.formula(paste(colnames(list.dfs[[df_name]])[1], "~ .")), data = list.dfs[[df_name]] ) # 拼接生成期望的结果对象名称并赋值到全局环境 assign(paste0("lm_Res_", df_name), lm.res, envir = .GlobalEnv) }
方法2:手动给list元素命名
如果不想用mget,可以手动给list的每个元素指定名称(名称与原DataFrame一致),再循环遍历名称:
# 手动给list的每个元素命名 list.dfs <- list( BrC15sy_h16_d_EE86228 = BrC15sy_h16_d_EE86228, BrC15sy_h16_d_EE86235 = BrC15sy_h16_d_EE86235, BrC15sy_h16_d_EE86256 = BrC15sy_h16_d_EE86256, BrC15sy_h16_d_EE86257 = BrC15sy_h16_d_EE86257, BrC15sy_h16_d_EE86267 = BrC15sy_h16_d_EE86267, BrC15sy_h16_d_EE86269 = BrC15sy_h16_d_EE86269 ) # 遍历list的元素名称 for (df_name in names(list.dfs)) { lm.res <- lm( as.formula(paste(colnames(list.dfs[[df_name]])[1], "~ .")), data = list.dfs[[df_name]] ) assign(paste0("lm_Res_", df_name), lm.res, envir = .GlobalEnv) }
两种方法都能生成符合期望的结果对象名称,推荐方法1,当DataFrame数量较多时更高效。
内容的提问来源于stack exchange,提问作者Debajyoti Kabiraj
相关产品推荐
相关产品推荐

