R语言中使用循环向dataframe逐行添加数据的问题求解
R循环遍历API为dataframe逐行添加数据解决方案
问题根因
你当前代码生成有行无列异常数据框的核心原因是:初始化的dashboard是没有任何列定义的空数据框,直接通过dashboard[i,] <- rewards[1,]按行赋值时,R无法匹配对应列结构,最终仅生成了对应行数的空观测。
解决方案
方案1:预分配内存(数据量大时优先使用,效率最高)
提前确定返回数据的列结构,一次性预分配对应长度的dataframe,避免循环中重复复制数据:
# 先运行首次请求拿到返回数据的列结构 first_node <- fromJSON(acct_hotspots_api_ep[1]) first_node <- as.data.frame(first_node) # 此处运行你自己的业务处理逻辑,生成首次处理后的rewards # 其他函数/命令..... first_rewards <- merge(first_rewards, last24h) first_rewards <- merge(first_rewards, last7) first_rewards <- merge(first_rewards, last30) first_rewards <- merge(first_rewards, last90) # 按照首次返回的结构预分配x行的dashboard dashboard <- as.data.frame(matrix(nrow = x, ncol = ncol(first_rewards))) colnames(dashboard) <- colnames(first_rewards) # 写入第一行数据 dashboard[1,] <- first_rewards[1,] # 循环处理剩余的API请求 for (i in 2:x){ node <- fromJSON(acct_hotspots_api_ep[i]) node <- as.data.frame(node) # 其他函数/命令..... rewards <- merge(rewards, last24h) rewards <- merge(rewards, last7) rewards <- merge(rewards, last30) rewards <- merge(rewards, last90) dashboard[i,] <- rewards[1,] }
方案2:动态追加(数据量小、不想提前跑首次请求时使用)
通过rbind自动匹配列结构,每次循环将新行追加到dataframe末尾:
dashboard <- data.frame() for (i in 1:x){ node <- fromJSON(acct_hotspots_api_ep[i]) node <- as.data.frame(node) # 其他函数/命令..... rewards <- merge(rewards, last24h) rewards <- merge(rewards, last7) rewards <- merge(rewards, last30) rewards <- merge(rewards, last90) # 自动匹配列追加行 dashboard <- rbind(dashboard, rewards[1,]) }
注意事项
- 要确保每次循环处理得到的
rewards[1,]的列名、列数据类型完全一致,否则会出现赋值或追加报错 - 当请求量x超过1000时优先使用预分配方案,动态
rbind每次都会全量复制dataframe,数据量大时运行效率会明显下降
内容的提问来源于stack exchange,提问作者dreamweaver
相关产品推荐
相关产品推荐

