【问题标题】:how to start a for loop in R programming如何在 R 编程中启动 for 循环
【发布时间】:2010-11-12 07:09:20
【问题描述】:

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

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

【问题讨论】:

  • 您是否查看过安装随附的“R 简介”手册?
  • 有多种方法可以完成您正在寻找的内容,而 for 循环是最不有效的方法之一。阅读手册时,Dirk 建议注意向量化和应用函数等短语。
  • 我希望这不是一个课堂项目。我知道有几个人使用垃圾邮件数据...

标签: r


【解决方案1】:

我假设您想遍历 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 作为123 的占位符 - 在循环的每次迭代中,i 采用序列1 中的下一个值, 2,3 所以我们可以 i) 访问 spamdataith 组件以获取下一个主题行, ii) 访问 @987654341 的 ith 元素@ 存储grepl() 调用的结果。

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

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

在上述函数中,我们使用x 而不是列表名称spamdata,因为当lapply()sapply() 循环遍历spamdata 列表时,各个组件(在@987654353 中由spamdata[[i]] 引用@loop) 作为参数x 传递给我们的函数,因此我们只需要在grepl() 调用中引用x

这就是我们如何在lapply()sapply() 中使用我们的包装函数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() 在您不需要跳过箍的地方非常简洁和有用创建一个可行的包装函数。

【讨论】:

    【解决方案2】:

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

    for(顺序变量)表达式

    表达式可以是单个 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)) 告诉循环对列表中的每个变量只执行一次。

    答案来自以下 来源:
    Loops in R
    Programming in R

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 2015-11-01
    • 1970-01-01
    • 2015-09-30
    • 2017-03-27
    • 2019-08-25
    • 2014-11-01
    • 1970-01-01
    相关资源
    最近更新 更多