2013-05-19 1 views
1

J'ai une grande trame de données df, avec des colonnes nommées:Comment exécuter lm pour chaque sous-ensemble de la trame de données, puis agrémenter le résultat?

age, income, country 

ce que je veux faire est très simpe en fait, faire

fitFunc<-function(thisCountry){ 
    subframe<-df[which(country==thisCountry)]; 
    fit<-lm(income~0+age, data=subframe); 
    return(coef(fit)); 
} 

pour chaque pays. Ensuite, agréger le résultat dans une nouvelle trame de données ressemble à:

countryname, coeffname 
1  USA   1.2 
2  GB   1.0 
3  France  1.1 

J'ai essayé de le faire:

do.call("rbind", lapply(allRics[1:5], fitit)) 

mais je ne sais quoi faire.

Quelqu'un peut-il aider?

merci!

+0

Je ne savais pas ... apparemment 'lm' a une option' subset': http://stackoverflow.com/questions/11328003/how-does-the-subset-argument-work- in-the-lm-function? rq = 1 Regardez les autres "liens connexes" à droite. – Frank

+0

Et qu'est-ce qu'un problème? Petite astuce - ajouter une virgule à 'subframe <-df [qui (country == thisCountry),]', sinon cette ligne devrait renvoyer une erreur. – DrDom

Répondre

2

Est-ce que cela fonctionne pour vous?

set.seed(1) 
    df<-data.frame(income=rnorm(100,100,20),age=rnorm(100,40,10),country=factor(sample(1:3,100,replace=T),levels=1:3,labels=c("us","gb","france"))) 

    out<-lapply(levels(df$country) , function(z) { 
     data.frame(country=z, age= coef(lm(income~0+age, data=df[df$country==z,])),row.names=NULL) 
    }) 
do.call(rbind ,out) 
+0

merci pour votre aide! mais cela ne donne qu'une seule trame de données de colonne, non? Comment lier la colonne country avec la sortie? savez-vous? –

+0

Editer la réponse pour inclure le pays – user20650

+0

Salut 20650, c'est génial! Merci beaucoup! –

2

Utilisation des données par exemple de @ user20650, cela semble produire le même résultat:

require(data.table) 
dt <- data.table(df) 
dt[,list(age=lm(income~0+age)$coef),by=country] 

# country  age 
# 1:  gb 2.428830 
# 2:  us 2.540879 
# 3: france 2.369560 

Vous devez installer le package data.table premier.

1

Notez que le package plyr est créé pour les tâches de ce type. Il effectue une fonction sur un sous-ensemble de données et renvoie les résultats sous une forme préspécifiée. En utilisant ddply, nous entrons dans une trame de données et obtenons une trame de données avec les résultats de retour. Voir plyr exemples de sessions et fichiers d'aide pour en savoir plus à ce sujet. Cela vaut vraiment la peine de se familiariser avec ce forfait! Voir http://plyr.had.co.nz/ pour un début.

library(plyr) 
age <- runif(1000, 18, 80) 
income <- 2000 + age*100 + rnorm(1000,0, 2000) 
country <- factor(sample(LETTERS[1:10], 1000, replace = T)) 
dat <- data.frame(age, income, country) 

get.coef <- function(dat) lm(income ~ 0 + age, dat)$coefficients 

ddply(dat, .(country), get.coef) 
Questions connexes