从Data Frame移除空值时遇dim(X)正长度错误的技术求助
解决R中移除数据框空值时的
dim(X) must have a positive length错误 这个报错的核心原因是:当你第一次执行b<-b[!apply(b == "", 1, all),]后,如果筛选后的数据框只剩一行一列,R会自动把它转换成向量(这是R的默认行为),此时再用apply就会报错——因为apply需要处理二维数据(比如数据框),而向量是一维的,没有维度信息。
而且你的代码里重复执行了两次相同的空值移除操作,这也可能加重这个问题。下面给你几个更可靠的解决方案:
方案1:抓取时直接过滤空文本(推荐)
与其先抓取所有文本再清理,不如在抓取阶段就过滤掉空内容,从根源避免空行:
library(rvest) Holidays <- read_html("http://www.spholidays.com/monuments.php") a <- data.frame(Places = html_text(html_nodes(Holidays,".cat-hd1"))) # 先抓取节点,提取文本后直接过滤空值 monument_nodes <- html_nodes(Holidays,"tr~ tr+ tr td:nth-child(1)") monument_text <- html_text(monument_nodes) # 过滤空字符串和NA值 monument_text <- monument_text[monument_text != "" & !is.na(monument_text)] # 转换为数据框 b <- data.frame(Monuments_Name = monument_text, stringsAsFactors = FALSE)
方案2:针对已存在的b进行安全清理
如果已经有了包含空值的b,可以用更安全的行筛选方式,避免apply的维度问题:
方法A:直接按列筛选(最简单)
# 确保b是数据框(防止被自动转成向量) if (!is.data.frame(b)) { b <- as.data.frame(b, stringsAsFactors = FALSE) colnames(b) <- "Monuments_Name" } # 移除Monuments_Name为空的行 b <- b[b$Monuments_Name != "", ]
方法B:用dplyr包的filter函数(更直观)
如果你习惯用tidyverse工具链,dplyr::filter会更清晰,且自动处理数据框结构:
library(dplyr) b <- b %>% filter(Monuments_Name != "")
方法C:用rowSums替代apply
如果一定要用类似apply的逻辑,rowSums可以安全处理数据框:
# 筛选出至少有一个非空值的行 b <- b[rowSums(b == "") != ncol(b), ]
这些方法都能避免dim(X) must have a positive length的错误,同时保留你需要的Taj Mahal、Red Fort in Agra等非空数据。
内容的提问来源于stack exchange,提问作者user9542319
相关产品推荐
相关产品推荐

