2013-07-19 4 views
0

Je les instructions suivantes dans R, j'utilise pour modifier les valeurs de variables data$theme selon le texte à l'intérieur data$paragraph, qui contient de longues chaînes de caractères:Comment accélérer une fonction R

lines <- grep('banana|apple', file$paragraph) # lines that match search terms 
    for (i in 1:length(lines)){ 
    data[lines[i], 'theme'] <- 'Fruit' 
    } 

Le problème avec cette commande est qu'elle est extrêmement inefficace avec des jeux de données volumineux. Mon cas réel a plus de 200 mille lignes; il faut plus d'une seconde à mon ordinateur pour faire chaque substitution et je devrai faire plus de 40 mille subs (et je ne peux pas me permettre que cette petite étape de mon script prenne plus de 5 heures à compléter). Je cherche désespérément un moyen d'accélérer cela, je parie qu'il y a une solution simple mais je ne peux pas trouver de meilleur moyen d'y arriver. Aidez-moi!

+2

Avez-vous essayé 'data [lines, 'theme'] <- 'Fruit''? Pour obtenir des réponses plus utiles, fournissez peut-être un échantillon de vos données. – ialm

Répondre

4
data[lines, 'theme'] <- 'Fruit' 

R est capable de travailler sur des vecteurs entiers en même temps. Profiter de ceci est un moyen facile d'accélérer les choses.

+0

Cool, cela semble beaucoup mieux, mais comme ce n'est pas une procédure ultra-rapide, j'aimerais toujours avoir un compteur. A l'intérieur, je pourrais juste ajouter 'print (i, 'of', length (lines))', mais comment puis-je en faire avec votre one-liner? –

+3

Non, mais avec seulement 200k enregistrements, je serais surpris si cela prend très longtemps. L'appel à 'grep' devrait en fait être la partie la plus longue. – Peyton

+0

Vous avez raison, vous venez de transformer ma commande de 5 heures en quelque chose qui prend moins de quelques secondes. Je me sens un peu embarassé, puisque j'ai fait 'data [c (1, 2, 3),]' dans d'autres situations et pourtant je me bats avec ça depuis des jours. Merci, Peyton, tu as sauvé mon week-end! –