2014-09-17 4 views
0

Objectif: prendre un en-tête data.frame et renvoyer un nouveau data.frame avec des variables supplémentaires créées à partir de calculs dans une fonction.Utilisation de boucles dans les fonctions dans R

Mon code existant fonctionne pour créer une transformation d'un data.frame:

transform<- function(x) { 
    transformtemp<- x 
    transformtemp[1]<- x[1] 
    for(i in 2:length(x)) { 
    transformtemp[i]<- x[i] + 0.9*transformtemp[i-1] 
    } 
    transformscale<- sum(x)/sum(transformtemp) 
    x<- transfomrtemp*transformscale 
} 

x[]<- lapply(x,transform) 

Avec ce code, je reviens un data.frame avec la fonction appliquée à toutes les colonnes de mes données.

J'ai besoin d'aide pour: 1. Pour l'instant, ce code n'utilise que 0.9 comme paramètre de désintégration. Je veux créer la sortie en utilisant plus de paramètres de désintégration, dis décroissance < - seq (0,1,0.1) et les enregistrer pour l'utilisation. 2. Je veux que la sortie soit les données d'origine plus de nouvelles colonnes de données avec la fonction appliquée aux différents taux de désintégration, avec des noms comme "column1_0.9", "column1_0.8", "column2_0.9" etc.

J'ai essayé d'utiliser une autre boucle avec un taux de décroissance changeant, mais je n'arrive pas à l'obtenir correctement. J'espère que tout cela a du sens et faites-moi savoir si je dois clarifier davantage.

Tout le meilleur et merci!

+0

Vous ne devez pas appeler une fonction 'transformer'. C'est le nom d'une fonction existante qui s'utilise beaucoup. – Roland

Répondre

0

fonction de votre choix sans attribuer aux données d'origine:

mytransform<- function(x) { 
    transformtemp<- x 
    transformtemp[1]<- x[1] 
    for(i in 2:length(x)) { 
    transformtemp[i]<- x[i] + 0.9*transformtemp[i-1] 
    } 
    transformscale<- sum(x)/sum(transformtemp) 
    x<- transformtemp*transformscale 
} 

A <- do.call(data.frame, lapply(mtcars,mytransform)) 

Faisons plus efficace avec la fonction filter:

mytransform1 <- function(x, d) { 
    y <- filter(x, d, sides=1, method="recursive") 

    transformscale<- sum(x)/sum(y) 
    c(y*transformscale) 
} 

B <- do.call(data.frame, lapply(mtcars, mytransform1, d=0.9)) 

all.equal(A, B) 
#[1] TRUE 

Maintenant, nous ajoutons un soutien pour les taux de désintégration multiples avec une boucle sapply supplémentaire :

mytransform <- function(x, d) { 
    y <- sapply(d, function(d, x) c(filter(x, d, sides=1, method="recursive")), x=x) 
    transformscale<- sum(x)/colSums(y) 
    t(t(y)*transformscale) 
} 
C <- do.call(data.frame, lapply(mtcars, mytransform, d=c(0.9, 0.8))) 
all.equal(B, setNames(C[,seq_along(B)*2-1], names(B))) 
#[1] TRUE 
+0

Roland: Merci beaucoup. Code élégant! – JMB