R语言for循环无法更新dataframe的问题排查求助
问题原因
循环中每次调用merge时,as.data.frame(kCounts[,i])生成的data.frame列名始终是V1,和all_perm中已存在的V1列重名。merge默认会按同名列进行匹配合并,而非添加新列,因此列数无法增长。
解决方案
在循环中为新生成的data.frame设置唯一列名,并在merge时指定by=NULL,强制生成笛卡尔积(即所有可能的组合),从而添加新列。
修改后的完整关键代码如下:
# 修改初始的all_perm生成,统一列名避免混淆 all_perm <- merge(as.data.frame(kCounts[,1]), as.data.frame(kCounts[,2]), all=TRUE, by=NULL) colnames(all_perm) <- c("col_1", "col_2") all_perm <- all_perm[rowSums(all_perm) <= n,] # 修改后的循环 for (i in 3:k){ print(i) # 给新列设置唯一名称 new_col <- as.data.frame(kCounts[,i]) colnames(new_col) <- paste0("col_", i) # 指定by=NULL,强制做笛卡尔积合并 all_perm <- merge(all_perm, new_col, all=TRUE, by=NULL) all_perm <- all_perm[rowSums(all_perm) <= n,] print(dim(all_perm)) }
补充说明
你手动执行时看似生效,可能是分步操作中无意中的列名差异(或对列数的误判)导致的。只有确保每次合并的列名唯一,并强制笛卡尔积合并,才能正确生成多列的所有组合。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

