如何在R中移除数据框中非数值元素并将空值转为NA
解决温度列数值提取与空值转换问题
问题分析
你的wentworth.castle列是带温度单位的字符型数据,包含空字符串,直接转数值时因特殊字符(°C)的编码问题报错,且固定截取字符的方法因数值位数不固定不可靠。
可行解决方案
方法一:Base R 原生处理
通过正则匹配提取所有数字和小数点,再处理空值并转为数值型:
# 移除所有非数字、非小数点的字符 tempdata$wentworth.castle <- gsub("[^0-9.]", "", tempdata$wentworth.castle) # 将空字符串替换为NA tempdata$wentworth.castle[tempdata$wentworth.castle == ""] <- NA # 转换为数值类型 tempdata$wentworth.castle <- as.numeric(tempdata$wentworth.castle)
- 正则
[^0-9.]会匹配所有非数字和非小数点的内容,不管°符号的编码是什么,都能统一移除,避免编码报错。 - 空字符串转为NA后,
as.numeric就能正常转换有效数值。
方法二:使用stringr包(更直观)
借助stringr的str_extract提取连续的数值序列:
library(stringr) # 提取字符串中的数值部分(整数+可选小数点+小数) tempdata$wentworth.castle <- str_extract(tempdata$wentworth.castle, "\\d+\\.?\\d*") # 空字符串转NA tempdata$wentworth.castle[tempdata$wentworth.castle == ""] <- NA # 转为数值型 tempdata$wentworth.castle <- as.numeric(tempdata$wentworth.castle)
- 正则
\\d+\\.?\\d*匹配:1个以上数字 + 可选小数点 + 0个以上数字,精准提取温度数值。
修正你之前的截取函数错误
你写的left函数参数名拼写错误(chat应为char),正确写法如下(但不推荐用于此场景,因为数值位数不固定):
left <- function(string, char){substr(string, 1, char)} # 调用示例(仅作演示,实际不建议用) tempdata$wentworth.castle <- left(tempdata$wentworth.castle, 6)
内容的提问来源于stack exchange,提问作者Bethy
相关产品推荐
相关产品推荐

