R语言循环向dataframe赋值仅保留最后一次迭代结果的修复咨询
问题成因
- 初始代码全列覆盖问题:你最初使用
df[,列号]的赋值语法时未指定行索引,会直接覆盖目标列的所有行数据,每一次迭代都会清空上一次的赋值结果,最终仅保留最后一次迭代的数值。同理初始代码的while循环中df[,2] = rowd1也是整列覆盖逻辑,最后只能拿到最后一次循环的kol值对应的结果。 - 调整后多列覆盖问题:调整后的代码中你使用
df[1,2:224] = output2语法,每次迭代都会把第1行的第2到224列全部赋值为当前x2对应的Gen值,相当于每循环一次就把这223列的内容全部覆盖一次,最后自然只剩下最后一次循环x2=223的结果。
修复方案
基础修复(保留原循环逻辑)
首先调整dataframe初始化的列数(你原来仅设置了12列,无法容纳224列的数据),再修改赋值时的索引逻辑,给每一列单独赋值:
# 初始化350行224列的空dataframe df = data.frame(matrix(nrow = 350, ncol = 224)) # 第1列赋值:每行对应1-350的数值 for (x in 1:350) { output <- paste0(x) df[x,1] = output } # 第2-224列的第1行赋值:对应Gen 1到Gen 223 for (x2 in 1:223) { output2 <- paste("Gen ",x2) # x2从1到223对应列号2到224,列索引取x2+1即可 df[1, x2 + 1] = output2 } # 如果需要给第2-224列的所有行都赋值为对应Gen值,把上一行的行索引1去掉即可: # df[, x2 + 1] = output2 # 自定义列名,可根据实际列数调整 colnames(df)[1] <- "Kromosom" colnames(df)[2:12] <- c("A","B","C","D","E","F","G","H","I","J","K") # 剩余列的列名可按需补充
优化方案(向量化赋值,无需循环)
R本身支持向量化操作,无需循环即可实现同等需求,运行效率更高:
df = data.frame(matrix(nrow = 350, ncol = 224)) # 第1列直接向量化赋值 df[,1] = as.character(1:350) # 第2-224列的第1行赋值 df[1, 2:224] = paste0("Gen ", 1:223) # 如果要给第2-224列整列赋值,使用rep函数批量处理即可 # df[, 2:224] = rep(paste0("Gen ", 1:223), each = 350)
内容的提问来源于stack exchange,提问作者Noval
相关产品推荐
相关产品推荐

