2013-05-19 1 views
1

У меня есть большой фрейм данных Д.Ф., с колоннами по имени, как:Как запустить 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

И в чем проблема? Маленький совет - добавьте запятую в 'subframe <-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) 

 Смежные вопросы

  • Нет связанных вопросов^_^