R语言中如何用paste0()获取assign创建的数据框的列?
问题解决:R中通过字符串访问
assign创建的数据框列 问题现象
在for循环中用assign()创建了多个数据框(如a2、a3),但尝试用paste0("a",2)$year访问列时触发报错:
Error: object 'year' not found
使用paste0("a",2)[year]也无法正确获取列数据。
错误原因
paste0("a",2)返回的是字符串"a2",而非实际的数据框对象。$和[运算符只能作用于数据框对象,不能直接作用于字符串,因此无法识别year列。
解决方案
方案1:使用get()函数转换字符串为对象
get()函数可以将字符串转换为对应的R对象,修改循环中访问列的代码即可:
# 替换原print行 print(head(get(paste0("a", rep)), n=2L)) # 替换原lines行 lines(get(paste0("a", rep))$year, get(paste0("a", rep))$Ne_median, type="l", col="orange")
方案2:推荐用列表存储数据框(替代assign)
assign()会创建大量零散的全局对象,不利于代码维护和调试。更优的方式是用列表统一存储所有数据框:
修改后的完整代码:
library(gtools) library(fs) library(stringr) pdf(paste0("combined.5rep.title.pdf"),width = 20, height = 25) par(mfcol=c(5,5),mar=c(5,5,4,2)+0.2,cex.lab=1.6, cex.axis=1.3,lwd=2) layout(matrix(c(1,2,3,4,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),nrow=5,ncol=5,byrow=T),width=c(1,1),height=c(1,1)) for (event in c("00d","01d","05d","09d","05i")){ # 初始化列表存储当前event的所有重复数据 df_list <- list() # 读取第一个重复数据 df_list[[1]] <- read.table(mixedsort(sort(fs::dir_ls(path=paste0("./ft_sim_10000Ne_20hapS_1E_50G_",event,"_20Chr_15Mb_1_MSFS"), recurse = TRUE, type = "file", glob = "*20hapS*50G*MSFS.final.summary"))),header=T,sep="\t") plot(df_list[[1]]$year, df_list[[1]]$Ne_median, type="l", col="red") mtext(side=3,text=paste0("10000Ne_20hapS_1E_50G_",event,"_20Chr_15Mb"),cex=0.8,line=1.2) # 读取并绘制后续重复数据 for (rep in c(2:5)){ df_list[[rep]] <- read.table(mixedsort(sort(fs::dir_ls(path=paste0("./ft_sim_10000Ne_20hapS_1E_50G_",event,"_20Chr_15Mb_1_",rep,"_MSFS"), recurse = TRUE, type = "file", glob = "*20hapS*50G*MSFS.final.summary"))),header=T,sep="\t") print(head(df_list[[rep]], n=2L)) lines(df_list[[rep]]$year, df_list[[rep]]$Ne_median, type="l", col="orange") } } dev.off()
这种方式更清晰,后续对数据的操作也更便捷,避免了全局环境中对象混乱的问题。
内容的提问来源于stack exchange,提问作者BeeBern
相关产品推荐
相关产品推荐

