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

如何用rbind.fill跳过空值或替换为NA?附加州高中爬取场景

解决方案:处理爬虫空值并绑定数据的两种实现

你的代码存在几个关键问题导致报错:未初始化目标数据框、列名拼写错误,以及空值处理逻辑缺失。以下是对应你两种思路的具体实现:

方案1:将空值替换为NA并保留所有学校

该方案会为无数据的学校填充NA,确保所有学校都出现在结果中:

library(rvest)
library(plyr) # 依赖rbind.fill

# 初始化原始数据框
CDS.code = c("01611190130229", "12626870111922", "19643031935618")
school = c("Alameda High", "American Indian Academy", "Mayfair High")
source = data.frame(CDS.code, school, stringsAsFactors = FALSE)

# 提前初始化目标数据框,避免首次循环报错
df_schools <- data.frame(school_id = character(), total_suspensions = character(), stringsAsFactors = FALSE)

for (page_result in source$CDS.code) { # 修正列名拼写错误:CDS.code而非CDS.Code
  link = paste0("https://dq.cde.ca.gov/dataquest/dqCensus/DisSuspCount.aspx?year=2020-21&agglevel=School&cds=", page_result) # 移除URL末尾多余空格
  
  page = read_html(link)
 
  school_id = page_result
  # 提取停课数据
  total_suspensions = page %>%
    html_nodes("#ContentPlaceHolder1_grdTotals tr:nth-child(2) td:nth-child(3)") %>%
    html_text()
  
  # 空值处理:无数据时赋值为NA
  if (length(total_suspensions) == 0) {
    total_suspensions <- NA_character_
  }
  
  # 绑定到目标数据框
  df_schools = rbind.fill(df_schools, data.frame(
    school_id,
    total_suspensions,
    stringsAsFactors = FALSE))
}

# 可选:合并原始数据框,匹配学校名称
df_schools <- merge(source, df_schools, by.x = "CDS.code", by.y = "school_id")

关键修正点:

  • 提前初始化df_schools,避免首次循环时变量不存在的错误
  • 修正列名大小写错误:source$CDS.code(原代码误写为CDS.Code)
  • 通过length(total_suspensions) == 0判断无数据状态,将空向量转换为NA_character_,确保数据框行能正常生成

方案2:跳过无数据的学校

如果不需要保留无数据的学校,可直接跳过此类条目:

library(rvest)
library(plyr)

CDS.code = c("01611190130229", "12626870111922", "19643031935618")
school = c("Alameda High", "American Indian Academy", "Mayfair High")
source = data.frame(CDS.code, school, stringsAsFactors = FALSE)

df_schools <- data.frame(school_id = character(), total_suspensions = character(), stringsAsFactors = FALSE)

for (page_result in source$CDS.code) {
  link = paste0("https://dq.cde.ca.gov/dataquest/dqCensus/DisSuspCount.aspx?year=2020-21&agglevel=School&cds=", page_result)
  
  page = read_html(link)
 
  school_id = page_result
  total_suspensions = page %>%
    html_nodes("#ContentPlaceHolder1_grdTotals tr:nth-child(2) td:nth-child(3)") %>%
    html_text()
  
  # 仅当有数据时才绑定行
  if (length(total_suspensions) > 0) {
    df_schools = rbind.fill(df_schools, data.frame(
      school_id,
      total_suspensions,
      stringsAsFactors = FALSE))
  }
}

df_schools <- merge(source, df_schools, by.x = "CDS.code", by.y = "school_id")

补充说明:

rbind.fill本身可以处理列数不一致的情况,但前提是每个待绑定的行都有对应列的有效值(包括NA)。空向量会导致无法生成合法的数据框行,因此必须先将空值转换为NA后才能正常使用该函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 22:30:49