2013-03-27 4 views
0

Может быть, что-то тривиальное, но я пытаюсь решить эту проблему:зацикливания dataframes с различным числом столбцов в г

Я должен кадров данных, один с 25 и другой с 9 столбцов. Теперь мне нужно установить полиномиальные уравнения, в которых моя зависимая переменная находится в кадре данных с 25 столбцами, а моя независимая переменная находится в кадре данных с 9 столбцами. На данный момент я объединил столбцы и создал кадр данных, называемый «my.data», поэтому я зацикливаю на зависимые переменные, используя одну независимую переменную в то время. Но я хотел бы выполнять функции в цикле 25 * 9 раз автоматически. Есть ли способ сделать это?

setwd("C:\\......") 

my.data <- read.table("MyData.txt", header = TRUE, sep = "\t") 


for(i in seq_along(my.data)) 
{ 

    fit1b <- lm(my.data[ ,i] ~ my.data$V1) 
    fit2b <- lm(my.data[ ,i] ~ poly(my.data$V1, 2, raw=TRUE)) 
    fit3b <- lm(my.data[ ,i] ~ poly(my.data$V1, 3, raw=TRUE)) 
    poly1 <-capture.output(summary(fit1b)) 
    poly2 <-capture.output(summary(fit2b)) 
    poly3 <-capture.output(summary(fit3b)) 


con = file(description = "MyResults.txt", open="a") 
write.table(poly1, file= con, append = TRUE, quote=F, col.names=FALSE, row.names= F) 
write.table(poly2, file= con, append = TRUE, quote=F, col.names=FALSE, row.names= F) 
write.table(poly3, file= con, append = TRUE, quote=F, col.names=FALSE, row.names= F) 
close(con) 
} 

ответ

1

Это прекрасная возможность использовать mapply и expand.grid

Например.

# some dummy data 
xx <- data.frame(replicate(5, runif(50))) 
yy <- setNames(data.frame(replicate(3, runif(50))), paste0('Y',1:3)) 
# all combinations 
cs <- expand.grid(list(pred = names(xx), resp = names(yy)), stringsAsFactors= FALSE) 

# a function to do the fitting 
fitting <- function(pred, resp, dd){ 
    # fit linear model 
    ff <- reformulate(pred, resp) 
    lmf <- lm(ff, data =dd) 
    # create a formula for poly(,2) 
    ff.poly2 <- update(ff, .~poly(.,2, raw=TRUE)) 
    # and poly(,3) 
    ff.poly3 <- update(ff, .~poly(.,3, raw=TRUE)) 
    # fit these models 
    lmp2 <- lm(ff.poly2, data = dd) 
    lmp3 <- lm(ff.poly3, data = dd) 
    # return a list with these three models 
    list(linear = lmf, poly2 = lmp2, poly3 = lmp3) 
} 

biglist <- mapply('fitting', pred = as.list(cs[['pred']]), 
     resp = as.list(cs[['resp']]), 
     MoreArgs = list(dd = cbind(xx,yy)), SIMPLIFY = FALSE) 

# give this list meaningful names 

names(biglist) <- do.call(paste, c(cs, sep = ':')) 

Вы можете извлечь вещи/суммировать вещи, используя несколько вложенных lapply заявления

например, сводки всех линейных моделей

lapply(lapply(biglist, `[[`,'linear'), summary) 

квадратичных моделей

lapply(lapply(biglist, `[[`,'poly2'), summary) 

Если вы хотите извлечь информацию из print(summary(lm)) в одном файле, что-то вроде

capture.output(lapply(biglist, function(x) lapply(x, summary)), file = 'results.txt') 

создаст файл с именем results.txt со всеми результатами напечатанных там.

+0

спасибо, что очень понравилось mnel, это сработало очень хорошо !!! Я очень ржавый на R .... Спасибо вам снова! !!David – david

+0

В коде есть одна вещь, которую я хотел бы сделать. Чтобы итоговый файл был суммирован ниже, если это список, это не так, но я не уверен, что могу сделать это как резюме. – david

0

Есть одна вещь, которую я хотел бы сделать, чтобы вывести резюме, а не список, но я не уверен, что можно использовать функцию записи, которую вы имеете. Есть ли способ получить это?

Вызов: лм (формула = My-Y-Lable ~ My-X-Label)

Остаточные: Мин 1Q Медиана 3Q Max -0,35445 -0,17420 -0,10931 0.06975 0.60246

Коэффициенты: Estimate Std. Ошибка т значение Pr (> | т |)
(Intercept) 0,7560212 0,0720984 10,49 1.24e-14 *

My-X-Label 0,0072100 0,0006597 10,93 2.68e-15 *

Signif. коды: '' 0 '' 0,001 '' 0.01 '' 0,05 0,1 '' 1

Остаточная стандартная ошибка: 0,2812 на 54 степеней свободы Множественный R-квадрат: 0,6887, Скорректированный R-квадрат: 0.6829 F-статистика: 119.5 на 1 и 54 DF, значение p: 2.676e-15

+1

См. Мой отредактированный ответ. – mnel

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