You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言循环仅向DataFrame添加首尾数据问题求助

问题原因

你的循环逻辑存在错误:每次循环中,df <- rbind(RoyalLondon_List, temp_list)都是将初始的RoyalLondon_List与当前单次循环获取的temp_list合并,完全覆盖了上一次循环生成的df。因此循环结束后,df只保留了初始数据和最后一次循环(CLDP0004)的数据,中间站点的数据被丢弃。

解决方案

方案1:修正循环累加逻辑

先初始化df为初始的RoyalLondon_List,之后每次循环将新获取的数据追加到已有df的末尾:

SiteCodes_all <- c('CLDP0002', 'CLDP0003', 'CLDP0004')

# 初始化df为初始数据集
df <- RoyalLondon_List

for(i in 1:length(SiteCodes_all)) {
        allsites <- paste0(Base,Node,SiteCodes_all[i],'/',Pollutant,StartTime,EndTime,Averaging,Key)
  
        temp_raw <- GET(allsites)
        temp_list <- fromJSON(rawToChar(temp_raw$content))
        # 将新数据追加到已有df中
        df <- rbind(df, temp_list)
}

方案2:使用向量化操作(R推荐风格)

用lapply遍历所有站点编码,批量获取数据后统一合并,这种方式更简洁且不易出错:

SiteCodes_all <- c('CLDP0002', 'CLDP0003', 'CLDP0004')

# 定义单个站点数据获取函数
get_site_data <- function(site_code) {
  url <- paste0(Base, Node, site_code, '/', Pollutant, StartTime, EndTime, Averaging, Key)
  temp_raw <- GET(url)
  fromJSON(rawToChar(temp_raw$content))
}

# 批量获取所有站点数据
site_data_list <- lapply(SiteCodes_all, get_site_data)
# 合并初始数据与所有站点数据
df <- rbind(RoyalLondon_List, do.call(rbind, site_data_list))

进阶优化:处理列名/类型不一致的情况

如果不同API返回的数据结构存在差异,推荐使用dplyr包的bind_rows函数,它能自动兼容列名不一致的情况:

library(dplyr)

site_data_list <- lapply(SiteCodes_all, get_site_data)
df <- RoyalLondon_List %>% 
  bind_rows(!!!site_data_list)

内容的提问来源于stack exchange,提问作者Eleri Faye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:41:24