R语言按字符类型拆分数据集:提取数字与字母行
问题分析
你原来的代码没得到预期结果,核心原因是is.numeric(as.numeric(DT$charnum))的判断逻辑不对:当把字母"A"/"B"转成数字时会得到NA,而is.numeric(NA)返回的是TRUE(因为NA属于numeric类型),所以这个筛选条件会把所有行都保留下来,自然不符合你的需求。
解决方案
这里有两种可靠的方法来拆分你的数据集:
方法1:利用转换后的NA值筛选
我们可以通过判断as.numeric()转换后是否为NA来区分数字和字母:
# 重新定义数据集(方便复现) DT <- as.data.frame(c("1","2", "3", "A", "B")) names(DT)[1] <- "charnum" # 筛选数字行:转换后非NA的就是可转为数字的字符 DT1 <- DT[!is.na(as.numeric(DT$charnum)), ] # 筛选字母行:转换后为NA的就是字母字符 DT2 <- DT[is.na(as.numeric(DT$charnum)), ]
运行后得到的结果完全符合预期:
DT1
charnum
1 1
2 2
3 3
DT2
charnum
4 A
5 B
方法2:用正则表达式精准匹配
如果你想更直接地判断字符串是否为纯数字,可以用grepl()配合正则表达式^\\d+$(匹配1个或多个数字的字符串):
DT1 <- DT[grepl("^\\d+$", DT$charnum), ] DT2 <- DT[!grepl("^\\d+$", DT$charnum), ]
这个方法的优势是可以精准控制匹配规则,比如如果你的数据里有带小数点的数字,可以把正则改成^\\d+\\.?\\d*$来匹配。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

