如何将循环变量作为新列插入输出DataFrame
问题:循环调用API后无法为每条记录关联对应变量
我从df1里拿到了变量列表(a,b,c),需要把每个变量传入API调用,API返回的数据行数不固定。我写了R代码想整合结果,但尝试给每条返回数据添加对应变量作为新列时,只有第一条记录能关联上变量,达不到每条数据都对应传入变量的效果。
代码示例:
df$list ### 包含变量(a,b,c) output_df<- data.frame() for(k in 1:length(df$list)) { res1z = GET(paste0("url1",df$list[[k]],"&StartDate=02-01-2023&EndDate=02-28-2023")) dataz = fromJSON(rawToChar(res1z$content)) dataz <- as.data.frame(fromJSON(rawToChar(res1z$content))) # dataz$emp_code<- df$list[[k]] output_df <- rbind(output_dfz1,dataz) }
df$list的数据结构:
SNo List 1 a 2 b 3 c
预期输出示例:
SNo OP2 OP3 OP4 OP5 Variable 1 5.1 3.5 1.4 0.2 a 2 4.9 3.0 1.4 0.2 a 3 4.7 3.2 1.3 0.2 a 4 4.6 3.1 1.5 0.2 a 5 5.0 3.6 1.4 0.2 a 1 5.1 3.5 1.4 0.2 b 2 4.9 3.0 1.4 0.2 b 3 4.7 3.2 1.3 0.2 b 4 4.6 3.1 1.5 0.2 b 5 5.0 3.6 1.4 0.2 b
解决方案
你的代码存在两个核心问题:
- 注释掉了添加变量列的关键代码
dataz$emp_code<- df$list[[k]],这一步是给当前API返回的所有数据打上对应变量标记的必要操作; - 合并数据时引用了未定义的
output_dfz1,应该使用初始化的output_df。
修正后的基础版代码
# 假设df是包含List列的数据框 output_df <- data.frame() for(k in seq_along(df$List)) { # 调用API获取数据 res1z <- GET(paste0("url1", df$List[[k]], "&StartDate=02-01-2023&EndDate=02-28-2023")) # 解析JSON为数据框 dataz <- as.data.frame(fromJSON(rawToChar(res1z$content))) # 为当前批次所有数据添加对应变量列 dataz$Variable <- df$List[[k]] # 合并到输出数据框 output_df <- rbind(output_df, dataz) }
高效优化版(数据量大时推荐)
循环中反复rbind性能较差,建议先用列表存储每个批次的数据,最后一次性合并:
output_list <- list() for(k in seq_along(df$List)) { res1z <- GET(paste0("url1", df$List[[k]], "&StartDate=02-01-2023&EndDate=02-28-2023")) dataz <- as.data.frame(fromJSON(rawToChar(res1z$content))) dataz$Variable <- df$List[[k]] output_list[[k]] <- dataz } # 合并所有数据 output_df <- do.call(rbind, output_list) # 若使用dplyr可以更简洁: # library(dplyr) # output_df <- bind_rows(output_list)
额外说明
- 用
seq_along(df$List)替代1:length(df$list)更安全,避免当List为空时出现逻辑错误; - 确保每次循环都给当前批次的
dataz添加Variable列,这样该批次的所有行都会带上对应的变量值。
内容的提问来源于stack exchange,提问作者SNT
相关产品推荐
相关产品推荐

