2013-05-19 88 views
1

我有一個大的數據幀DF,以命名爲列:如何爲數據框的每個子集運行lm,然後聚合結果?

age, income, country 

我想要做的其實很simpe,爲每個國家做

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

。然後彙總結果到一個新的數據幀的樣子:

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

我試圖做的:

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

但我不知道下一步該怎麼做。

任何人都可以幫忙嗎?

謝謝!

+0

我不知道這一點......顯然'lm'有一個'subset'選項:http://stackoverflow.com/questions/11328003/how-does-the-subset-argument-work- in-the-lm-function?rq = 1查看右邊的其他「相關鏈接」。 – Frank

+0

什麼是問題?小提示 - 給子幀添加逗號<-df [which(country == thisCountry),]',否則這行應該返回錯誤。 – DrDom

回答

2

這是否適合您?

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

感謝您的幫助!但是這隻給出一個單列數據框,對吧?如何將國家列與輸出結合?你知道嗎? –

+0

編輯答案包括國家 – user20650

+0

嗨20650,這太棒了!非常感謝! –

2

使用@ user20650的示例數據,這似乎產生同樣的結果:

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 

你需要首先安裝data.table包。

1

請注意,plyr包是爲這樣的任務而創建的。它對數據的一個子集執行一個函數,並以預先確定的形式返回結果。使用ddply我們輸入一個數據框並獲得一個數據框,並返回結果。請參閱plyr示例會話和幫助文件以瞭解更多信息。這是值得的努力來獲得這個包! 請參閱http://plyr.had.co.nz/開始。

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) 
相關問題