Comment vectoriser R strsplit?
Lors de la création de fonctions qui utilisent strsplit
, le vecteur des entrées de ne pas se comporter comme vous le souhaitez, et sapply
doit être utilisé. Cela est dû à la liste de sortie que strsplit
produit. Est-il possible de vectoriser le processus - qui est, la fonction produit le bon élément dans la liste pour chacun des éléments de l'entrée?
Par exemple, de compter les longueurs de mots dans un caractère de vecteur:
words <- c("a","quick","brown","fox")
> length(strsplit(words,""))
[1] 4 # The number of words (length of the list)
> length(strsplit(words,"")[[1]])
[1] 1 # The length of the first word only
> sapply(words,function (x) length(strsplit(x,"")[[1]]))
a quick brown fox
1 5 5 3
# Success, but potentially very slow
Idéalement, quelque chose comme length(strsplit(words,"")[[.]])
où .
est interprétée comme étant la partie correspondante du vecteur d'entrée.
OriginalL'auteur James | 2010-06-16
Vous devez vous connecter pour publier un commentaire.
En général, vous devriez essayer d'utiliser un vectorisé fonction pour commencer. À l'aide de
strsplit
auront souvent besoin d'une sorte de répétition par la suite (qui sera plus lent), donc essayez de les éviter si possible. Dans votre exemple, vous devez utilisernchar
à la place:Plus généralement, de prendre avantage du fait que
strsplit
renvoie une liste et l'utiliserlapply
:Ou d'utiliser un
l*ply
fonction de la famille deplyr
. Par exemple:Edit:
En l'honneur de Bloomsday, j'ai décidé de tester les performances de ces approches à l'aide de l'Ulysse de Joyce:
Maintenant que j'ai tous les mots, nous pouvons faire notre compte:
La vectorisé fonction et
lapply
sont considérablement plus rapide que l'originalsapply
version. Toutes les solutions de retour à la même réponse (comme on le voit par la sortie de synthèse).Apparemment la dernière version de
plyr
est plus rapide (c'est un peu plus ancienne version).Alors, j'imagine qu'il doit y avoir quelque chose d'autre se passe avec votre fonction. Comme vous pouvez le voir ci-dessus, je viens de tester cela sur un vecteur avec plus de 270k dossiers et obtenu les mêmes résultats. Vous pouvez essayer de fournir plus de votre code ou encore la fourniture de certaines de vos données.
D'ailleurs, je viens d'installer plyr version 0.1.9 dans la R 2.11.1 et avaient les mêmes timings comme ci-dessus.
Oui, j'ai tort, l'indexation de la liste lorsque je l'ai appelé. Il fonctionne maintenant, mais les horaires lapply ne sont pas beaucoup mieux que sapply. L'algorithme doit travailler par le biais de la scission de chiffres dans l'ordre, alors peut-être qui est à l'origine du problème.
Le plyr lenteur est résolu dans la version devel - mais plyr est généralement plus utile face à des problèmes plus complexes où la fois pour des applications individuelles domine.
OriginalL'auteur Shane