2009-10-25 7 views
5

J'utilise le package R's stats et souhaite par la boucle à travers column[x] dans all the rows of a dataframe, opérer sur les données dans each cell dans la colonne avec une fonction et de transmettre le résultat à une nouvelle colonne (avec la calculated result en le new column aligné avec les données column[x])en boucle à travers une colonne en R

J'ai deux problèmes:

  1. Je ne peux pas faire fonctionner
  2. looping semble être découragé dans le R articles J'ai lu. Y a-t-il une approche alternative et si non, quelqu'un a-t-il un exemple de la façon de réaliser la boucle?
+0

Pouvez-vous nous donner plus de détails? Comme un exemple de problème avec lequel vous travaillez? – ariddell

+2

Le bouclage n'est pas nécessairement déconseillé. Faites-le fonctionner d'abord, et seulement alors pensez à devenir plus rapide. –

Répondre

8

Sans aucun exemple, il est difficile de savoir comment répondre. Le cas de base de ce que vous décrivez, cependant, est la suivante:

#Just a very simple data frame 
dat <- data.frame(x = c(1, 2, 3)) 
#Compute the squared value of each value in x 
dat$y <- dat$x^2 
#See the resultant data.frame, now with column y 
dat 

Lorsque vous dites R au carré un vecteur (ou la structure vecteur semblable, comme dat $ x), il sait carré chaque valeur séparément . Vous n'avez pas besoin de boucler explicitement ces valeurs la plupart du temps - bien que, comme le remarque Dirk, vous ne devriez vous soucier de l'optimisation de vos boucles que si elles vous causent des problèmes. Cela dit, je préfère certainement lire et écrire

dat$y <- dat$x^2 

à:

for(i in 1:length(dat$x)){ 
    dat$y[i] <- dat$x[i]^2 
} 

... si possible.

+0

Merci. Je peux faire fonctionner l'arithmétique correctement. Je ne suis pas en mesure de transmettre le contenu d'une base de données à une fonction. Voici le problème. Voici la partie supérieure du cadre (données appelées) avec rubriques « composé » et « SMILES » (sourires sont une représentation textuelle d'une molécule) Compound_ID SMILES 12 345 c1cccccc1 Je veux utiliser la fonction parse.smiles() à lis dans les sourires et sort une molécule. Si je le fais sur une molécule c'est OK (indésirable <- "c1ccccc1", parser.sourire (courrier indésirable) Si je sp <- get.smiles.parser() indésirable <- sapply (données sourires $, parse.smiles, analyseur = sp) il ne peut pas interpréter le sourire – Andy

+0

OK. Désolé, je ne savais pas trop où vous étiez en R, alors j'ai pensé que je devrais jeter l'affaire de base là-bas. "inconnu" pourrait l'avoir - mais sinon, votre meilleur pari est de poster un petit ensemble de données et la fonction. Il est assez difficile de comprendre ce qui ne va pas dans une description, et au moins, je ne peux obtenir aucune fonction d'application sans expérimentation. –

1

si parse.smiles() est une fonction que vous souhaitez appliquer à tous l'entrée d'un vecteur « VEC », vous pouvez utiliser:

lapply(1:length(vec),parse.smiles(vec[i])) 
+2

Merci à tous. La colonne qui m'intéressait avait été lue en tant que facteur. Je devais explicitement dire à la fonction de lire dans le contenu en tant que caractères et je ne l'avais pas réalisé avant d'être signalé. Cela fonctionne maintenant. (et des excuses pour le commentaire brouillé ci-dessus - Il a été formaté avec des retours qui ont disparu quand posté) – Andy

1

La seule raison looping est découragé est qu'il est lent. R est conçu pour fonctionner sur des vecteurs à la fois et a beaucoup de fonctions pour y parvenir. L'ensemble s'applique famille, ainsi que des fonctions comme Vectorize pour aider. Donc, l'idiome est que si vous utilisez pour les boucles que vous ne pensez pas en R, mais parfois pour les boucles sont tout simplement appropriés. Pour cela dans le mode de pensée R, vectorisez votre fonction, si elle n'est pas déjà vectorisée (voir la fonction Vectoriser), puis appelez cette fonction avec la colonne entière comme argument et affectez-la à la nouvelle colonne.

f<-Vectorize(function(x,...),'x') 
data$newcolumn<-f(data[,1]) 

La famille appliquer (appliquer, sapply, lapply, mapply, tapply) sont également des solutions de rechange. La plupart des fonctions R natives sont déjà vectorisées, mais soyez prudent lorsque vous passez des arguments supplémentaires qui sont censés être interprétés comme des vecteurs.

Questions connexes