2015-10-08 1 views
1

dire que j'ai plusieurs jeux de données, d1, d2, d3, stockée sous forme de liste:exécuter une fonction de plusieurs ensembles de données en utilisant une boucle à R

a<-1:10 
d1<-data.frame(a) 
d2<-data.frame(a) 
d3<-data.frame(a) 
d1$b<-a*1 
d2$b<-a*2 
d3$b<-a*3 

list<-c(d1,d2,d3) 

I ont alors une fonction, qui correspond à une régression .

fxn<- function(param1, param2, dataset){ 
    mod<-lm(dataset$param1~dataset$param2) 
    return(coef(mod)[2]) 
} 

Je souhaite alimenter cette fonction, les paramètres à utiliser pour la régression (a et b) et ensuite la liste des ensembles de données stockés dans list. S'il vous plaît noter que cette fonction ne fonctionne pas comme je le voudrais pour le moment. Je veux qu'il calcule les ajustements spécifiques du jeu de données et retourne les pentes.

+0

Essayez, lapply (liste , fxn) .... n'utilisez pas la liste comme nom de votre liste. Cela devrait être quelque chose comme, A <- list (d1, d2, d3). Je ne sais pas ce que tu essayais de faire avec d1 $ b <- a * 1 ??? J'espère que cela t'aides. – user1945827

Répondre

2

Je suppose que vous souhaitez la fonction d'être comme ça alors:

fxn<- function(param1, param2, dataset){ 
    #run model according to param1 and param2 
    mod<-lm(dataset[,param1]~dataset[,param2]) 
    #calculate slope 
    slope <- coef(mod)[2] 
    #name it correctly 
    names(slope) <- param2 
    return(slope) 
} 

Ensuite, vous pouvez utiliser un lapply pour utiliser la fonction pour chaque data.frame:

lapply(list, function(x) fxn('a','b',x)) 

Sortie:

[[1]] 
b 
1 

[[2]] 
    b 
0.5 

[[3]] 
     b 
0.3333333 

données:

a<-1:10 
d1<-data.frame(a) 
d2<-data.frame(a) 
d3<-data.frame(a) 
d1$b<-a*1 
d2$b<-a*2 
d3$b<-a*3 

#made a small change 
#stored the data.frames in a list 
#as I assume you probably wanted 
list<-list(d1,d2,d3) 

Edit:

Ainsi, afin de créer le format que vous mentionnez dans votre commentaire que vous pourriez faire:

#first have the data.frames in a named list 
list<-list(d1=d1,d2=d2,d3=d3) 

puis faire:

temp <- data.frame(t(data.frame(lapply(list, function(x) fxn('a','b',x))))) 
#and if you want rownames as a column 
temp$dfs <- row.names(temp) 

> temp 
      b dfs 
d1 1.0000000 d1 
d2 0.5000000 d2 
d3 0.3333333 d3 
+0

c'est proche de la perfection. Est-il possible de modifier la sortie de sorte que plutôt que d'imprimer ce que vous avez listé sous "Sortie:" il imprime une colonne de noms de fichiers (d1, d2, d3), puis une colonne de pentes (1, 0.5, 0,33333)? – colin