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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:33:09