如何一步移除数据中pred_ranking和precaution_score的N/A值?
解决方案
先说说你代码里的问题
- 最初的写法语法错误:管道符
%>%后面必须接函数,不能直接写data[...],管道是把前面的数据传给下一个函数处理,这么写R无法识别。 - dplyr尝试里的问题:你的数据中不存在
pred_ranking列(从dput结果看,列名是Preseason.Ranking或Post.Season.Ranking),这会导致complete.cases报错;另外ggplot代码里用了未定义的d2对象,肯定运行失败。 - 额外问题:
precaution_score是字符型,绘图时用离散刻度不合适,建议先转换为数值型。
正确的一步到位写法
假设你要处理的是Preseason.Ranking(如果是其他列,替换成对应名称)和precaution_score列,用dplyr可以这么写:
library(dplyr) # 读入数据→将"N/A"转为NA→过滤掉指定列有NA的行 data_complete <- read.csv("Spreadsheet.csv") %>% na_if("N/A") %>% filter(!is.na(Preseason.Ranking), !is.na(precaution_score))
如果需要处理的列较多,用across更高效(需dplyr 1.0.0及以上版本):
data_complete <- read.csv("Spreadsheet.csv") %>% na_if("N/A") %>% filter(across(c(Preseason.Ranking, precaution_score), ~!is.na(.x)))
顺便修正你的绘图代码
先转换precaution_score的类型,再用处理好的数据绘图:
library(ggplot2) library(scales) # 处理数据并转换列类型 data_processed <- read.csv("Spreadsheet.csv") %>% mutate(precaution_score = as.numeric(na_if(precaution_score, "N/A"))) %>% filter(!is.na(Preseason.Ranking), !is.na(precaution_score)) # 筛选SEC联盟的学校用于绘图 graph_data <- data_processed %>% filter(conference == "SEC") graph2 <- ggplot(graph_data, aes(Preseason.Ranking, precaution_score, color = school)) + geom_point() + facet_wrap(~conference, ncol = 2) + # 排名是数值型,用连续刻度更合理 scale_x_continuous(breaks = pretty_breaks(n=2)) + scale_y_continuous(breaks = pretty_breaks(n=5)) + theme(legend.position="bottom") graph2
内容的提问来源于stack exchange,提问作者AC100000
相关产品推荐
相关产品推荐

