Je suppose que vous voulez faire une boucle sur les éléments de spamdata
et de construire un indicateur si la chaîne "viagra"
se trouve dans les lignes d'objet de vos e-mails.
permet de configurer des données fictives à des fins d'illustration:
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]))
Ensuite, nous créons un vecteur words
pour tenir le résultat de chaque itération de la boucle. Vous ne voulez pas augmenter words
ou tout autre objet à chaque itération - cela forcera la copie et ralentira votre boucle. Au lieu de cela allouer de la mémoire avant de commencer - ici en utilisant la longueur de la liste sur laquelle nous voulons boucle:
words <- logical(length = length(spamdata))
Vous pouvez configurer une boucle comme si
## seq_along() creates a sequence of 1:length(spamdata)
for(i in seq_along(spamdata)) {
words[ i ] <- grepl("viagra", spamdata[[ i ]]$Header["Subject"])
}
On peut alors regarder words
:
> words
[1] TRUE FALSE FALSE
Ce qui correspond à ce que nous savons des sujets inventés.
Remarquez comment nous avons utilisé i
comme support de place pour 1
, 2
et 3
- à chaque itération de la boucle, i
prend la valeur suivante dans la séquence 1
, 2
, 3
afin que nous puissions i) accéder au i
le composant de spamdata
pour obtenir la ligne d'objet suivante, et ii) accéder à l'élément i
e de words
pour stocker le résultat de l'appel grepl()
. Notez qu'à la place d'une boucle implicite, nous pourrions également utiliser les fonctions sapply()
ou lapply()
, qui créent la boucle pour vous mais peuvent nécessiter un peu de travail pour écrire une fonction personnalisée. Au lieu d'utiliser grepl()
directement, nous pouvons écrire un wrapper:
foo <- function(x) {
grepl("viagra", x$Header["Subject"])
}
Dans la fonction ci-dessus, nous utilisons x
au lieu du nom de la liste spamdata
parce que quand lapply()
et boucle sapply()
sur la liste spamdata
, les composants individuels (référencés par spamdata[[i]]
dans la boucle for()
) est passé à notre fonction comme argument x
de sorte que nous avons seulement besoin de se référer à x
dans l'appel grepl()
.
Voici comment nous pourrions utiliser notre fonction enveloppe foo()
dans lapply()
ou sapply()
, d'abord lapply()
:
> lapply(spamdata, foo)
[[1]]
[1] TRUE
[[2]]
[1] FALSE
[[3]]
[1] FALSE
sapply()
simplifiera l'objet retourné lorsque cela est possible, comme suit:
> sapply(spamdata, foo)
[1] TRUE FALSE FALSE
Autre que ça, ils fonctionnent de la même manière.
Remarque, nous pouvons rendre notre fonction enveloppe foo()
plus utile en lui permettant de prendre un argument définissant le spam mot que vous souhaitez rechercher:
foo <- function(x, string) {
grepl(string, x$Header["Subject"])
}
Nous pouvons passer des arguments supplémentaires à nos fonctions avec lapply()
et sapply()
comme ceci:
> sapply(spamdata, foo, string = "viagra")
[1] TRUE FALSE FALSE
> sapply(spamdata, foo, string = "Lottery")
[1] FALSE FALSE TRUE
que vous trouverez le plus utile (boucle for()
ou lapply()
, sapply()
versions) w Je vais dépendre de vos antécédents de programmation et que vous trouvez le plus familier. Parfois, for()
est plus facile et plus simple à utiliser, mais peut-être plus verbeux (ce qui n'est pas toujours une mauvaise chose!), Tandis que lapply()
et sapply()
sont assez succincts et utiles où vous n'avez pas besoin de sauter à travers les cerceaux pour créer une fonction wrapper .
Avez-vous consulté le manuel 'Introduction à R' fourni avec votre installation? –
Il y a un certain nombre de façons d'accomplir ce que vous cherchez, avec des boucles pour être l'un des moyens les moins efficaces de le faire. En lisant le manuel, Dirk suggère de faire attention aux expressions telles que la vectorisation et d'appliquer des fonctions. –
J'espère que ce n'est pas pour un projet de classe. Je connais quelques personnes qui utilisent ces données de spam ... – hadley