【发布时间】:2018-04-02 20:32:47
【问题描述】:
我知道在 R 中应该避免 for 循环,而应该使用矢量化操作。
我想用for 循环解决这个问题,然后尝试使用apply 系列,然后也在Rcpp 中。
我加载了一个包含一列密码(字母数字)的数据集。
一旦加载(示例,为了速度),我想根据某些条件“contains_lower_chars”、“contains_numbers”等创建具有值 (0,1) 的新列。
这是我尝试做的,但它不起作用 - 这意味着我创建的每一列都具有相同的值。
library(tidyverse)
set.seed(123)
# load dataset from url, skip the first 16 rows
df <- read.csv('http://datashaping.com/passwords.txt', header = F, skip = 16) %>%
sample_frac(.001) %>%
rename(password = V1)
patterns = c("[a-z]","[A-Z]","[0-9]+")
df$has_lower <- 0
df$has_upper <- 0
df$has_numeric <- 0
for(i in 1:nrow(df)){
for(j in patterns){
n <- ifelse(grepl(j, df$password[i]),1,0)
}
df$has_lower[i] <- n
df$has_upper[i] <- n
df$has_numeric[i] <- n
}
我想到的输出是:
password has_lower has_upper has_numeric
Bigmaccas 1 1 0
0127515559 0 0 1
dbqky73p 1 0 1
【问题讨论】:
-
“不起作用”到底是什么意思?你有错误吗?一些意想不到的输出?寻求帮助时,您应该包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出。
-
@MrFlick 您可以重现运行上述代码的整个示例。它包含指向用于填充 df 的 URL 文件的链接。我将添加输出错误(我创建的每一列都有相同的值)
-
但是你没有给出想要的结果。如果不设置种子,使用
sample_frac()之类的东西是无法重现的(另外,它确实依赖于代码中未明确提及的dplyr)。我不知道为什么当您为每个列分配相同的n值时,您会假设列会有所不同。 -
@MrFlick 已编辑
-
我将删除
[rcpp]标签,因为这与 Rcpp 无关。