如何对DataFrame使用函数?substr筛选第三列首字符为"I"的行失效如何解决
问题原因
核心原因是df[,3]的返回值类型不符合substr的输入要求,分为两种常见场景:
- 如果你使用的是tidyverse的
tibble类型数据框,df[,3]默认返回的是单列tibble结构,不是字符向量。substr接收到非向量输入时,会先将整个结构隐式转为字符串再做截取,返回结果完全不符合预期。 - 如果第三列为因子(factor)类型,旧版本R中
substr会直接读取因子的底层整数编码做截取,自然无法匹配到字符"I"。
你单独提取列赋值给变量时,大概率用了df[[3]]/df$列名的提取方式,拿到的是纯向量,隐式转换也会正常生效,所以校验可以通过。
解决方法
- 方法1:修改列提取语法,保证传入
substr的是向量结构,把df[,3]替换为df[[3]]即可:
which(substr(df[[3]], 1, 1) == "I")
- 方法2:增加显式类型转换,避免因子类型导致的异常:
which(substr(as.character(df[[3]]), 1, 1) == "I")
- 方法3:使用R原生的前缀匹配函数
startsWith,写法更简洁不容易出错:
which(startsWith(as.character(df[[3]]), "I"))
- 如果需要直接返回筛选后的完整数据行,不需要单独取索引,可以直接按条件取子集:
# 普通data.frame写法 df[startsWith(as.character(df[[3]]), "I"), ] # tidyverse风格写法 library(dplyr) df %>% filter(startsWith(.[[3]], "I"))
内容的提问来源于stack exchange,提问作者Abrag
相关产品推荐
相关产品推荐

