如何检查字符串中是否存在满足>=30条件的数值
检查字符串向量中是否存在>=30的数值
给定字符串向量:
myString <- c("NA,1,2,3,7,9,45", "NA,1,100,", "NA,23,24,25,27")
不能直接用字符串匹配(比如str_detect),因为我们需要判断的是数值大小,而非字符匹配。正确的做法是先拆分每个字符串为单独元素,转换为数值后再检查是否存在符合条件的值:
Base R 实现
# 遍历每个字符串,执行拆分、转数值、检查逻辑 sapply(myString, function(x) { # 拆分字符串为字符向量 split_vals <- strsplit(x, ",")[[1]] # 转换为数值(空字符和NA会转为NA) num_vals <- as.numeric(split_vals) # 检查是否有数值>=30,忽略NA any(num_vals >= 30, na.rm = TRUE) })
运行结果:
NA,1,2,3,7,9,45 NA,1,100, NA,23,24,25,27 TRUE TRUE FALSE
Tidyverse 实现
如果习惯用tidyverse工具链,可以这样写:
library(tidyverse) myString %>% # 拆分每个字符串为列表 map(str_split, pattern = ",") %>% # 展开列表为字符向量 map(unlist) %>% # 转换为数值 map(as.numeric) %>% # 检查每个向量是否存在>=30的数值 map_lgl(~any(.x >= 30, na.rm = TRUE))
运行结果:
[1] TRUE TRUE FALSE
关键说明
- 拆分字符串时,末尾的逗号会产生空字符,转换为数值后变为NA,因此需要用
na.rm = TRUE忽略这些无效值 any()函数用于判断向量中是否存在至少一个满足条件的元素
内容的提问来源于stack exchange,提问作者Seydou GORO
相关产品推荐
相关产品推荐

