繁体   English   中英

如何在R编程中启动for循环

[英]how to start a for loop in R programming

我是编程的新手,我写了一个代码来查找第一封电子邮件中的垃圾邮件,但是我想编写一个for循环,对所有电子邮件都执行此操作。 任何帮助,将不胜感激。 谢谢。

words = grepl("viagra", spamdata[[ 1 ]]$header[ "Subject"])

我假设您想遍历spamdata各个元素,并建立一个指标,以确定是否在电子邮件的主题行中找到了字符串"viagra"

让我们设置一些虚拟数据用于说明目的:

subjects <- c("Buy my viagra", "Buy my Sildenafil citrate",
              "UK Lottery Win!!!!!")
names(subjects) <- rep("Subject", 3)
spamdata <- list(list(Header = subjects[1]), list(Header = subjects[2]),
                 list(Header = subjects[3]))

接下来,我们创建一个向量words来保存循环的每次迭代的结果。 您不想在每次迭代时都增加words或其他任何对象-这样会强制复制并降低循环速度。 而是在开始之前分配存储空间-在这里使用我们要循环遍历的列表的长度:

words <- logical(length = length(spamdata))

您可以这样设置一个循环

## seq_along() creates a sequence of 1:length(spamdata) 
for(i in seq_along(spamdata)) {
    words[ i ] <- grepl("viagra", spamdata[[ i ]]$Header["Subject"])
}

然后我们可以看一下words

> words
[1]  TRUE FALSE FALSE

哪个与我们从虚构主题中了解的内容相匹配。

注意我们是如何使用的i作为占位符12 ,和3 -在循环的每次迭代中, i将在下次值序列中的123 ,所以我们可以ⅰ)访问的i的个分量spamdata以获得下一个主题行, 并且 ii)访问wordsi个元素以存储grepl()调用的结果。

请注意,除了隐式循环,我们还可以使用sapply()lapply()函数,它们为您创建了循环,但可能需要一些工作来编写自定义函数。 代替直接使用grepl() ,我们可以编写包装器:

foo <- function(x) {
    grepl("viagra", x$Header["Subject"])
}

在上面的函数中,我们使用x代替列表名称spamdata因为当lapply()sapply()spamdata列表上循环时,各个组件(由for()循环中的spamdata[[i]]引用)传递给我们的函数作为参数x因此我们只需要在grepl()调用中引用x

这就是我们可以在lapply()sapply()首先使用lapply()情况下使用包装函数foo() lapply()

> lapply(spamdata, foo)
[[1]]
[1] TRUE

[[2]]
[1] FALSE

[[3]]
[1] FALSE

sapply()将尽可能简化返回的对象,如下所示:

> sapply(spamdata, foo)
[1]  TRUE FALSE FALSE

除此之外,它们的工作方式相似。

请注意,我们可以使包装函数foo()更有用,方法是允许它接受定义您要搜索的垃圾邮件词的参数:

foo <- function(x, string) {
    grepl(string, x$Header["Subject"])
}

我们可以使用lapply()sapply()将额外的参数传递给函数,如下所示:

> sapply(spamdata, foo, string = "viagra")
[1]  TRUE FALSE FALSE
> sapply(spamdata, foo, string = "Lottery")
[1] FALSE FALSE  TRUE

您会发现最有用的( for()循环或lapply()sapply()版本)将取决于您的编程背景以及您最熟悉的背景。 有时for()更易于使用和简单,但可能更冗长(这并不总是一件坏事!),而lapply()sapply()则非常简洁实用,在您不需要跳过篮球的情况下创建一个可行的包装函数。

在R中,采用这种形式,其中variable是迭代变量的名称,而sequence是向量或值列表:

用于(顺序可变)表达式

该表达式可以是单个R命令-或用大括号括起来的几行命令:

for (variable in sequence) { 
    expression
    expression
    expression
}

在这种情况下,for(words){做您想做的事}

基本循环理论

循环命令的基本结构为: for(i in 1:n){stuff to do} ,其中n是循环将执行的次数。

listname[[1]]引用列表“ listname”中的第一个元素。

在for循环中, listname[[i]]是指与for循环的第i次迭代相对应的变量。

for(i in 1:length(yesnovars))告诉循环仅对列表中的每个变量执行一次。

答案来自以下来源:
R中的循环
用R编程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM