在R中搜索多个字符串中的字符频率

时间:2015-03-07 19:05:40

标签: r

我最近遇到了一个包含1000万个密码的数据集,并决定在R中操作它以查看数据集所包含的信息会很有趣。这只是我第二次使用R,但我设法成功编写了一些代码,例如第一个字符的频率,数据集中最长和平均密码,标准偏差,并创建一个飞行频率图。 / p>

我现在遇到麻烦的地方是尝试确定特定字符的频率。例如,假设我想查看所用数字的频率表,以便我可以看到最常用的密码中的哪些数字(1,2,3,4,5,6,7,8,9,0)。我尝试使用“grep”函数,但只返回了索引。我还考虑将每个密码转换为特定的单个字符,然后查找所有字符的频率,但这似乎效率低下。最终我希望实现的是确定哪些单个字符的使用频率最高且最不频繁,例如“%”是最不常用的符号!,@,#,$,%,^,&,* ,(,)其中“!”是最常用的。

有没有人有任何建议?一旦我克服了这个障碍,似乎代码很容易复制,然后找到我应该能够处理的符号频率,小写字母,大写字母等。

所以我想说我有以下模拟代码:

testpass<-c("devils2000", "rangers1994", "qwerty", "cat$rule!","mattdamon",
 "12345678", "metrics2000", "fishcakes", "vampire", "Rabits2003")

Zero<-table(grepl("0",testpass))
Zero

Two<-table(grepl("2",testpass))
Two

#how many passwords have numbers total
table(grepl(paste(c(1:9, 0), collapse = "|"), testpass))
False    TRUE
    5      5

归零返回以下暗示3/10(33.33%)的密码包含零。

FALSE  TRUE 
    7     3 

两次返回 - 所有密码的4/10或40%包含2

FALSE  TRUE 
    6     4 

我希望知道的是,是否有办法在字符的基础上测试数字0的频率。例如,在密码“devils2000”中,字符0出现不止一次,虽然它在33.33%的密码中使用,但并不代表所有字符的33.33%。

如果这是不可能的,我可以解决上面反映的总密码的百分比,并且好奇是否有办法一次搜索多个字符,例如“0,1,2,3,4,5 ,6,7,8,9,“找出包含任何这些数字的密码的百分比。我问这个的原因是因为变量Zero和Two都包含TRUE和FALSE信息,我最终想要隔离TRUE数字然后绘制它们。每个角色一个接一个地执行此操作将是乏味的,可能不是最好的方法。

1 个答案:

答案 0 :(得分:2)

我会通过strsplit一百万个密码一次性完成。在这里,我已经通过pws的开始生成使问题重现:

pass_gen <- function(){
    chars <- c(0:9, LETTERS, letters, c("?", "#", "$", "!", "@"))
    paste(sample(chars, sample(6:10, 1)), collapse="")
}

n <- 1000000
pws <- sapply(1:n, function(i) pass_gen())

##现在strsplit。如果你想要百分比,则除以tabe的总和:

chars <- table(unlist(strsplit(paste(pws, collapse=""), NULL)))

chars
100*round(chars/sum(chars), 4)