R语言中用for循环填充DataFrame列失败,求问题排查与解决
问题分析与解决方案
错误原因
你的循环代码存在两个关键问题:
- 列名引用逻辑错误:
df$i``中的i被当作固定字符串"i"处理,而非循环变量i的当前年份值。这导致每次循环都在给名为i的列赋值,最终只保留最后一次迭代的结果。 - 初始列未被赋值:你提前创建了2004、2006列,但循环中根本没对这些列写入数据,反而新增了无用的
i列。
修正方案
方案一:修复循环逻辑
用方括号[[ ]]动态引用列名,确保循环时能匹配到对应年份的列:
# 定义目标年份向量 years <- c(2004, 2006) # 初始化8行、对应年份数量列的空DataFrame df <- data.frame(matrix(nrow = 8, ncol = length(years))) # 设置列名为年份 colnames(df) <- years # 循环赋值 for (year in years) { # 将年份转为字符串,动态匹配列名 df[[as.character(year)]] <- my_function(year) }
方案二:更简洁的向量化写法
用sapply直接批量生成结果并转为DataFrame,无需手动初始化:
years <- c(2004, 2006) df <- as.data.frame(sapply(years, my_function))
运行上述任意代码后,就能得到你预期的输出:
> df 2004 2006 1 0 0 2 0 0 3 0 0 4 0 0 5 20 83 6 89 205 7 1 0 8 2 1
内容的提问来源于stack exchange,提问作者Rikki Franklin Frederiksen
相关产品推荐
相关产品推荐

