R 替换有0行,数据有25个错误
我正在尝试制作一个包含25个不同密码的列表,以对照另一个50个密码的列表进行检查,然后返回匹配项。这是一个关于密码的大学项目。我的想法是列出25个最常用的密码,我想告诉我50个密码中哪一个匹配最常用的25个。但是,我一直收到以下错误:R 替换有0行,数据有25个错误,r,R,我正在尝试制作一个包含25个不同密码的列表,以对照另一个50个密码的列表进行检查,然后返回匹配项。这是一个关于密码的大学项目。我的想法是列出25个最常用的密码,我想告诉我50个密码中哪一个匹配最常用的25个。但是,我一直收到以下错误: Error in $<-.data.frame(*tmp*, "Percent", value = character(0)) : replacement has 0 rows, data has 25 运行printCounts(be
Error in $<-.data.frame(*tmp*, "Percent", value = character(0)) :
replacement has 0 rows, data has 25
运行printCounts(best.ct)
reads时显示错误的回溯
Error in `$<-.data.frame`(`*tmp*`, "Percent", value = character(0)) :
replacement has 0 rows, data has 25
4.
stop(sprintf(ngettext(N, "replacement has %d row, data has %d",
"replacement has %d rows, data has %d"), N, nrows), domain = NA)
3.
`$<-.data.frame`(`*tmp*`, "Percent", value = character(0))
2.
`$<-`(`*tmp*`, "Percent", value = character(0))
1.
printCounts(worst.ct)
您的函数有几个地方似乎有问题
makeCounts
引用的是pswd
,但是Final\u DF
具有pswd
和pswd\u长度
。R在做部分匹配,我猜它不是你想要的。让我们先通过设置选项[1]来证明它在使用什么:
选项(warnPartialMatchDollar=TRUE)#请参阅?选项
best.ct您的函数似乎有几处错误
makeCounts
引用的是pswd
,但是Final\u DF
具有pswd
和pswd\u长度
。R在做部分匹配,我猜它不是你想要的。让我们先通过设置选项[1]来证明它在使用什么:
选项(warnPartialMatchDollar=TRUE)#请参阅?选项
如果您只想检查(一组)密码是否在一组错误密码中,则可以使用
Final_DF$Pswd %in% worst.pass
这将为您提供一个向量TRUE
或FALSE
。您可以运行sum(Final\u DF$Pswd%在%best.pass中)
来获取错误密码匹配的总数,或者表(Final\u DF$Pswd[Final\u DF$Pswd%在%best.pass中)
来快速查看匹配情况
但是,如果您的目的是检查不断添加密码的集合(我猜这是您的目的,因为您创建了这些函数),那么以下内容可能会很有用:
result <- c()
for (i in 1:length(Final_DF$Pswd)) {
if (Final_DF$Pswd[i] %in% worst.pass) {
result[i] <- which(worst.pass == Final_DF$Pswd[i])
} else
result[i] <- NA
}
table(worst.pass[result[!is.na(result)]])
请注意,对于大量密码,不建议循环。在这种情况下,整洁的tidyverse
方法值得一看。如果您只想检查(一组)密码是否在一组错误密码中,您可以使用
Final_DF$Pswd %in% worst.pass
这将为您提供一个向量TRUE
或FALSE
。您可以运行sum(Final\u DF$Pswd%在%best.pass中)
来获取错误密码匹配的总数,或者表(Final\u DF$Pswd[Final\u DF$Pswd%在%best.pass中)
来快速查看匹配情况
但是,如果您的目的是检查不断添加密码的集合(我猜这是您的目的,因为您创建了这些函数),那么以下内容可能会很有用:
result <- c()
for (i in 1:length(Final_DF$Pswd)) {
if (Final_DF$Pswd[i] %in% worst.pass) {
result[i] <- which(worst.pass == Final_DF$Pswd[i])
} else
result[i] <- NA
}
table(worst.pass[result[!is.na(result)]])
请注意,对于大量密码,不建议循环。在这种情况下,整洁的tidyverse
方法值得一看。您应该使用dput
提供Final_-DF
,内容为:可能存在重复的候选者,nrow(Final_-DF$Pswd)
而不是nrow(Final_-DF)
?如果它是一个简单的列,那么它保证返回NULL
。顺便说一句,让您的函数依赖一个既没有在函数中定义也没有传递给函数的外部变量是一个坏主意:这会破坏再现性,并且会使故障排除变得困难。一个快速的选择是在printCounts(ct,finaldf)
中添加一个参数,并使用printCounts(best.ct,Final_DF)
@r2evans调用它,这会在打印术语方面产生不同,计数和百分比,但它无法识别匹配项仅显示为0计数。您应该使用dput
提供Final_-DF
,阅读:可能重复的候选项。应该nrow(Final_-DF$Pswd)
而不是nrow(Final_-DF)
?如果它是一个简单的列,那么它保证返回NULL
。顺便说一句,让您的函数依赖一个既没有在函数中定义也没有传递给函数的外部变量是一个坏主意:这会破坏再现性,并且会使故障排除变得困难。一个快速的选择是在printCounts(ct,finaldf)
中添加一个参数,并使用printCounts(best.ct,Final_DF)
@r2evans调用它,它打印术语、计数和百分比,但它无法识别匹配项,只显示为0计数。谢谢,您的更改成功了,总之,为了检查我的理解,这一切都归结为一个DF中重复的pswd名称`选项(warnPartialMatchDollar=TRUE)'这行代码做什么,它是否有助于我们指出问题?(1)您的函数中有两个错误。(2) 该选项集有助于确定其中一个问题在哪里,当您逐行遍历代码时,另一个错误是显而易见的。要了解有关该选项的更多信息,请参阅并搜索warnpartialmachdollar
;我可以在这里复制/粘贴,但最好是找到权威文档。谢谢,您的更改成功了,总之,检查我的理解,这一切都是因为在一个DF中重复了pswd名称`选项(warnPartialMatchDollar=TRUE)'这行代码做什么,它是否有助于我们指出问题?(1)您的函数中有两个错误。(2) 该选项集有助于确定其中一个问题在哪里,当您逐行遍历代码时,另一个错误是显而易见的。要了解有关该选项的更多信息,请参阅并搜索warnpartialmachdollar
;我可以在这里复制/粘贴,但最好找到权威文档。
result <- c()
for (i in 1:length(Final_DF$Pswd)) {
if (Final_DF$Pswd[i] %in% worst.pass) {
result[i] <- which(worst.pass == Final_DF$Pswd[i])
} else
result[i] <- NA
}
table(worst.pass[result[!is.na(result)]])
dragon iloveyou monkey password sunshine superman
1 1 1 1 1 1