基于部分匹配替换字符串——tidyverse实现报错问题
替换含特定字符的字符串为NA的正确实现
问题描述
有一个字符类型列wind_speed_m_s,部分观测值的字符串中包含"ph"(包括带空格的形式如"0.8 ph"),需要将所有包含"ph"的字符串替换为NA。
原始数据
wind_speed_m_s <- c("1.7", "0.7", "0", "0.6", "0.4", "1.2", "1.9", "1.3", "2.0, gust to 3.7", "0.5", "1.8", "1.4", "3.4", "2.8", "1.6", "2", NA, "0.9", "0.8", "1", "1.1", "2.6", "2.4", "1.1ph", "1.7 kt", "2.1", "1.5", "0ph", "3", ".4 /s", "0.3", "2.3", "0.2", "3.3", "3.9ph", "1.5ph", "1ph", "2ph", "1.7ph", "0.8 ph", "1.5 ph", "2.2", "1.9 k/hr", "2.5", "NA", "0.4/s", "1/s") data_raw <- tibble(wind_speed_m_s)
错误代码及原因
尝试的代码:
date <- data_raw %>% mutate(wind_speed_m_s = str_replace(wind_speed_m_s, pattern = str_detect("ph"), "NA"))
报错信息:
Error in `mutate()`: ! Problem while computing `wind_speed_m_s = str_replace(wind_speed_m_s, pattern = str_detect("ph"), "NA")`. Caused by error in `type()`: ! argument "pattern" is missing, with no default Backtrace: 1. ... %>% ... 9. stringr::str_detect("ph") 10. stringr:::type(pattern)
错误原因:
str_detect需要两个参数:待检测的字符串向量和匹配模式,代码中只传入了"ph",缺少第一个参数,导致报错。str_replace的pattern参数需要是正则表达式字符串,而非逻辑值,即使str_detect调用正确,返回的逻辑向量也无法作为str_replace的pattern使用。
正确实现方法
方法一:用if_else结合str_detect
通过逻辑判断筛选出包含"ph"的元素,替换为NA:
data_clean <- data_raw %>% mutate(wind_speed_m_s = if_else(str_detect(wind_speed_m_s, "ph"), NA_character_, wind_speed_m_s))
注:使用NA_character_而非普通NA,确保列的字符类型保持一致,避免类型转换问题。
方法二:用str_replace_all配合正则表达式
匹配所有包含"ph"的字符串,直接替换为NA:
data_clean <- data_raw %>% mutate(wind_speed_m_s = str_replace_all(wind_speed_m_s, ".*ph.*", NA_character_))
正则表达式.*ph.*表示匹配任意包含"ph"的字符串(.*匹配任意长度的任意字符)。
内容的提问来源于stack exchange,提问作者Eizy
相关产品推荐
相关产品推荐

