使用dplyr过滤R数据框时var>50条件未生效的问题求助
解决dplyr过滤条件未生效的问题
Hey there! Let's break down why your filter isn't working—you've got a couple of straightforward issues in your code, plus a data type gotcha that's easy to miss. Here's what's going wrong and how to fix it:
1. 错误引用了字符串而非列名
在你最后一行filter代码里:
filter(charnam == "Total dissolved solids" & "var" > 50)
这里的"var"只是一个普通字符串,不是数据框里的列名。看你的数据集预览,存储数值的列是val,不是var。你需要去掉引号,直接引用列名:val > 50。
2. 数值列是字符类型,无法正确做数值比较
你的val列是字符(chr)类型,不是数值型。当你用字符串和数字做比较时(比如"154" > 50),R会按字典序而非数值大小来判断——比如字符串"154"会被认为小于"50",因为"1"在字典里排在"5"前面,这完全不是你想要的结果!
修正后的完整代码
下面是修复后的代码,关键改动都做了标注:
if (!require(pacman)) { install.packages('pacman') } pacman::p_load("ggplot2", "tidyr", "plyr", "dplyr") #### Read in the necessary data ###### roadsalt_data <- read.table("QADportaldata_1988-2015.tsv", header = T, sep = "\t", fill = T, stringsAsFactors = F) # Convert date column from a character class to a date class ### roadsalt_data$stdate <- as.Date(roadsalt_data$stdate) ## Filter dataset to only contain columns I need ######## filtered_roadsalt <- roadsalt_data %>% select(orgid, stdate, locid, charnam, val) %>% # 先把字符类型的val转换为数值型,这是核心修复步骤 mutate(val = as.numeric(val)) %>% # 合并过滤条件让代码更整洁 filter( between(stdate, as.Date("1996-01-01"), as.Date("2015-07-01")), charnam == "Total dissolved solids", val > 50 )
额外注意事项
- 如果转换
val时出现警告(比如部分值无法转为数字),可以在mutate后添加drop_na(val)来移除转换后产生的NA行:mutate(val = as.numeric(val)) %>% drop_na(val) %>% - 转换后可以用
str(filtered_roadsalt)或glimpse(filtered_roadsalt)确认val已经变成数值(num)类型。
内容的提问来源于stack exchange,提问作者NBE
相关产品推荐
相关产品推荐

