R筛选三文鱼养殖死亡率数据返回空对象的问题求助
R筛选三文鱼养殖死亡率数据返回空对象的问题求助
嘿,我来帮你找找问题所在~看了你的代码和提供的可复现数据,能发现几个关键的小错误,导致你的筛选结果一直为空:
- 列名拼写错误:你在
subset函数里写的是candata$Mortality.rate...(末尾带三个点),但不管是你的可复现数据还是原数据的列名都是Mortality.rate,根本不存在带三个点的列。R会把不存在的列当成全NA的向量,而NA > 0.07的结果都是NA,subset默认会排除所有条件为NA的行,最后自然返回空对象。 - 转换后的数值列没用到:你虽然把
Mortality.rate转成了数值型的data_mort变量,但后续筛选的时候还是用的原数据框里的列。如果你的原CSV里Mortality.rate是字符型(比如带百分号、逗号这类非数值字符),直接用字符和数值比较会出问题,而你又没把转换后的列替换回原数据框,等于白转了。
修复方案
我给你两种可行的修复方式,你可以根据习惯选择:
方式一:Base R 原生语法
# 读取原数据 candata <- read.csv("Canada standardized.csv") # 把Mortality.rate转换为数值型,直接替换回原数据框 candata$Mortality.rate <- as.numeric(candata$Mortality.rate) # 先检查转换后有没有NA(如果原数据有非数值内容,转换会产生NA,这时候要先清理数据) sum(is.na(candata$Mortality.rate)) # 如果结果大于0,说明有转换失败的行,得去原数据里排查原因 # 筛选死亡率大于0.07的行(列名要和数据框里的完全一致) candatamax <- subset(candata, Mortality.rate > 0.07)
方式二:用dplyr(更直观简洁)
如果你习惯tidyverse的语法,用dplyr的filter函数会更不容易出错:
library(dplyr) candatamax <- read.csv("Canada standardized.csv") %>% mutate(Mortality.rate = as.numeric(Mortality.rate)) %>% # 转换为数值型 filter(Mortality.rate > 0.07) # 筛选符合条件的行
用你的可复现数据测试
你提供的subset_reprducible里,所有死亡率都小于0.07,所以筛选>0.07自然为空,但如果调低阈值比如>0.03,就能得到符合条件的行:
subset_reprducible %>% filter(Mortality.rate > 0.03)
运行后会返回Site.Name为Baxter Islets的行,它的死亡率是0.0345,符合条件。
额外排查小技巧
- 用
str(candata)查看数据框的列类型,确认Mortality.rate是numeric类型,而不是character。 - 用
summary(candata$Mortality.rate)查看死亡率的整体分布,先确认原数据里有没有大于0.07的值,避免是数据本身就没有符合条件的行的情况。
备注:内容来源于stack exchange,提问作者Chloe Emes
相关产品推荐
相关产品推荐

