R语言查找多个data.frame共有列名时返回NULL的解决方法
问题根源
noquote(paste("data_t",toString(i),sep=""))本质仍为字符串类型,noquote()仅修改字符串的打印显示效果,不会将字符串转换为R环境中真实存在的数据框对象。colnames()仅能作用于数据框/矩阵类对象,作用于字符串时自然返回NULL。
修正方案
核心是使用get()函数,将字符串形式的对象名转换为环境中对应的实际数据框对象,和原需求逻辑一致的修正代码如下:
for (i in 1:10){ for (j in 1:10){ # get() 会根据传入的对象名字符串,返回对应的数据框对象 df_i <- get(paste0("data_t", i)) df_j <- get(paste0("data_t", j)) common_cols <- intersect(colnames(df_i), colnames(df_j)) assign(paste0("common_column_names_", i, "_", j), common_cols) } }
优化建议
- 减少重复计算:
data_ti和data_tj的共有列与data_tj和data_ti的计算结果完全一致,且i=j时共有列就是该数据框的全部列,无额外计算价值,可仅计算i<j的场景,减少90%的计算量:
for (i in 1:9){ for (j in (i+1):10){ df_i <- get(paste0("data_t", i)) df_j <- get(paste0("data_t", j)) common_cols <- intersect(colnames(df_i), colnames(df_j)) assign(paste0("common_column_names_", i, "_", j), common_cols) } }
- 更易管理的输出:如果不想生成大量零散的独立对象,可以把结果存储到嵌套列表中,后续调用更便捷:
common_cols_list <- list() for (i in 1:10){ common_cols_list[[paste0("data_t",i)]] <- list() for (j in 1:10){ df_i <- get(paste0("data_t", i)) df_j <- get(paste0("data_t", j)) common_cols_list[[paste0("data_t",i)]][[paste0("data_t",j)]] <- intersect(colnames(df_i), colnames(df_j)) } } # 调用示例:获取data_t1和data_t3的共有列 common_cols_list[["data_t1"]][["data_t3"]]
内容的提问来源于stack exchange,提问作者Finn Jonas
相关产品推荐
相关产品推荐

