如何用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
相关产品推荐
相关产品推荐

