gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:03:54 26 4
gpt4 key购买 nike

我是编程新手,我编写了一个代码来查找第一封电子邮件的垃圾邮件,但我想编写一个 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作为 1 的占位符, 2 , 和 3 - 在循环的每次迭代中, i取序列中的下一个值 1 , 2 , 3所以我们可以 i) 访问 i spamdata 的第一个组成部分获取下一个主题行,并且 ii) 访问 i words 的第一个元素存储 grepl() 的结果称呼。

请注意,我们也可以使用 sapply() 来代替隐式循环。或 lapply()函数,它为您创建循环,但可能需要一些工作来编写自定义函数。而不是使用 grepl()直接,我们可以写一个包装器:
foo <- function(x) {
grepl("viagra", x$Header["Subject"])
}

在上面的函数中我们使用 x而不是列表名称 spamdata因为当 lapply()sapply()循环 spamdata列表中,各个组件(在 spamdata[[i]] 循环中由 for() 引用)作为参数 x 传递给我们的函数所以我们只需要引用 xgrepl()称呼。

这就是我们如何使用我们的包装函数 foo()lapply()sapply() , 第一个 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 - 如何在 R 编程中启动 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4162363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com