如何在R语言的DataFrame中筛选出5位长度的数字?
解决方案
问题根源:使用read.table默认读取数据时,IN列会被解析为数值型,前导零会被自动剔除(比如00441会变成441),而且你的代码里用正则处理小数部分完全没必要——数据里根本没有小数,这就是筛选失败的核心原因。
下面是两种可行的解决方法:
方法一:Base R 的 subset()
先确保读取数据时把IN列保留为字符型,再筛选长度为5的行:
# 读取数据,指定IN列为字符型 DATA <- read.table(header=TRUE, text=" ID IN 1 012 2 1234 3 222222 4 1359764 5 123 6 00441", colClasses = c("integer", "character")) # 筛选IN列长度为5的行 subset(DATA, nchar(IN) == 5)
运行后会得到ID为6的行,也就是IN为00441的记录。
方法二:dplyr 的 filter()
同样先保证IN是字符型,再用dplyr筛选:
library(dplyr) # 读取数据(同样指定colClasses保留字符型) DATA <- read.table(header=TRUE, text=" ID IN 1 012 2 1234 3 222222 4 1359764 5 123 6 00441", colClasses = c("integer", "character")) # 筛选符合条件的行 DATA %>% filter(nchar(IN) == 5)
如果已经读取了数据且IN列已被转成数值型(前导零丢失),则无法恢复前导零,只能重新读取时指定字符型。
另外,如果你要筛选的是数值本身为5位数(不管前导零,即数值在10000到99999之间),可以直接用数值判断:
# 这种情况不需要把IN设为字符型 DATA <- read.table(header=TRUE, text=" ID IN 1 012 2 1234 3 222222 4 1359764 5 123 6 00441") # Base R版本 subset(DATA, IN >= 10000 & IN <= 99999) # dplyr版本 DATA %>% filter(between(IN, 10000, 99999))
不过你的示例数据里没有符合这个条件的记录,因为00441会被解析为441,属于3位数。
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

