2010-08-04 7 views
3

Merci pour votre lecture. Je trouve souvent que j'ai besoin d'appliquer une fonction à des tranches de mes données, puis lier les sorties. Je construis habituellement une boucle à cet effet, mais je suis sûr que je le fais mal, et que dans R je devrais utiliser une façon différente de penser. Pouvez-vous s'il vous plaît m'aider à apprendre une meilleure façon de faire cela?R - Comment transformer une boucle en une fonction dans R

Avec grâce,

adam

rm(m); m=0; # this variable will hold the output of the loop 
    for (nobs in as.numeric(levels(factor(s1$obs)))) { # go over observer index 
     for (nses in as.numeric(levels(factor(subset(s1, obs==nobs)$session)))) { # go over session index 
      ns1=subset(s1, obs== nobs & session==nses & ky %in% c(1,2)); # the data slice of interest 
      ds=round(clfdMc (ns1),2); cs=round(cfdMc (ns1),2); # apply function to data slice 
      rw=cbind(nobs,nses,ds[2,3],ds[3,3],ds[2,3]-ds[3,3], cs[1,3],cs[2,3],nobs+nses/10, ds[2,4],ds[3,4],cs[1,4],cs[2,4]) # create a row from function output 
      m=rbind(m,rw); #print(paste('obs:',nobs,' nses:',nses,'clear d:',ds[2,3],'red d',ds[3,3]))# bind new row to previous rows 
     } 
    } 

m=data.frame(m[2:dim(m)[1],]) # create a data frame from these results 
names(m)=c('obs','ses','D_clear','D_red','diffD','D_cg-1','D_cg+1','mark','C_clear','C_red','C_cg-1','C_cg+1') # give names to column variables 
+1

Pour commencer, ajoutez des espaces à votre code afin que les gens puissent le lire! Blocs de retrait, envelopper les longues lignes, etc. Merci! – Harlan

+0

Je m'excuse pour ça. Je suis nouveau ici. –

Répondre

6

Le paquet plyr a été construit spécifiquement pour traiter les problèmes de manipulation de données comme celle-ci. Découvrez quelques-unes de la documentation sur la page Web: http://had.co.nz/plyr/

Je ne comprends pas exactement la syntaxe round() que vous avez utilisé, mais je crois que l'équivalent plyr appel serait

library(plyr) 
ddply(s1, .(obs, session), transform, ds = round(clfdMc, 2), cs = round(cfdMc, 2)) 

Je ne suis pas exactement sûr que cela fera ce que vous voulez. Votre code est un peu opaque.

+0

Comme par magie! Merci d'avoir pris le temps de m'aider. C'est une bonne direction. Il m'est arrivé de télécharger le paquet 10 avant de voir votre message. –

Questions connexes