我希望在用户提供的数据集中找到真实的虚假识别号码(想想社会保障#,电话号码等),因此很麻烦。
有些用户故意输入虚假信息,例如“idk”,“fu”,123456或222222.
我可以很容易地过滤出这些词,但我想得到一点点发烧友并抓住更多明显错误的信息。
从概念上讲,我想删除几乎所有数字都是唯一的数字,几乎每个数字都相同。所以2220222和123451这样的数字将被删除。
这需要运行得相当快,而不是一个巨大的内存占用,因此在每个条目上执行内部循环并不是真的可行。我希望/认为必须有一个聪明的方法与正则表达式来做这件事。
这是我想要发生的事情的一个稻草人:
filter.func(my.str.array, 2, 2)
### Returns a logical array of length "my.str.array" with "TRUE" meaning that
### it would not be filtered, and "FALSE" that a filtering rule was broken
### the "2" and "2" are, respectively:
### First "2": the min # of acceptable non-unique values (e.g., to catch 123456)
### Second "2": the min # of acceptable non-duplicated values (to catch 222222)
谢谢!
答案 0 :(得分:5)
在这里,我使用strsplit
将单词分成字符;然后我使用table
计算字符数。
filter.func<-function(x, mindup=2, mindiff=2) {
spt<-lapply(strsplit(x,""), table)
sapply(spt, function(x) {sum(x>1)>=mindup & sum(x>0)>=mindiff})
}
filter.func(c("22222","123456","234356"),2,2)
# [1] FALSE FALSE TRUE
可能更好地测试更正面和负面的值。