2015-11-18 2 views
1

Я хотел бы превратить вывод функции печати в объект dataframe. Я использовал этот код, но я получаю только последнюю строку в виде строки данных. Вот это игрушка dataframe:Как получить выход функции печати в dataframe

df <- read.table(text = " target birds wolfs  
       32   9   7 
       56   8   4 
       11   2   8 
       22   2   3 
       33   8   3 
       54   1   2 
       34   7   16 
       66   1   5 
       74   17  7 
       52   8   7 
       45   2   7 
       65   20  3 
       99   6   3 
       88   1   1 
       77   3   11 
       55   30   1 ",header = TRUE) 

for(i in names(df)) 

    { 
     fit <- lm(df[,i] ~ target, data=df) #does a regression per column 
     res<- summary(fit)$r.squared 
     b<-print(paste(res,i))    
    } 
# I got this output from the print function : 
[1] "1 target" 
[1] "0.0110699859137896 birds" 
[1] "0.07231285430469 wolfs" 

Как можно превратить этот вывод в кадр данных, который содержит два столбца: первый из них для значения (1,0.11,0.07), а второй один для имена (цель, птицы, волки) Я пытался использовать эту команду, но я получил только линию СЛП вывода на печать:

b1<-as.data.frame(b) 
b1 
         b 
1 0.07231285430469 wolfs 

ответ

3

Я бы просто запустить простой sapply

data.frame(Col = names(df), 
      Rsqrd = unname(sapply(df, function(x) summary(lm(x ~ df$target))$r.squared))) 
#  Col  Rsqrd 
# 1 target 1.00000000 
# 2 birds 0.01106999 
# 3 wolfs 0.07231285 
+1

спасибо @David Arenburg, один код строки, который прекрасно работает. – mql4beginner

1

Вы можете немного изменить вашу функцию:

b<-as.data.frame(matrix(NA,nrow=length(names(df)),ncol=2)) 
# or b<-data.frame(Rsq=numeric(),Name=character(),stringsAsFactors=FALSE) 

for (i in seq_along(names(df))){ 
    j<-names(df)[i] 
    fit <- lm(df[,j] ~ target, data=df) 
    rsq <- summary(fit)$r.squared 
    b[i,]<-cbind(rsq,j)   
} 

b 
        V1  V2 
1     1 target 
2 0.0110699859137896 birds 
3 0.07231285430469 wolfs 

Что не работает в вашей функции, так это то, что на каждой итерации изменилось значение b, а предыдущие значения были удалены. Здесь значения помещаются в dataframe, и вы можете использовать его позже.

+0

Спасибо @etienne .. – mql4beginner

1

Я бы сэкономил все в списке, а затем сгладил его в data.frame.

Что-то вдоль линий

N <- 10 

my.list <- vector("list", N) 

for (i in 1:N) { 
    my.list[[i]] <- c(element1 = runif(1), element2 = runif(1)) 

do.call("rbind", my.list) 
     element1 element2 
[1,] 0.63435664 0.57285398 
[2,] 0.04031899 0.06093284 
[3,] 0.63446004 0.03669334 
[4,] 0.27712280 0.80234739 
[5,] 0.08285555 0.92606686 
[6,] 0.17928155 0.93633017 
[7,] 0.04661537 0.08380414 
[8,] 0.41108456 0.18566136 
[9,] 0.27616150 0.38485649 
[10,] 0.21108018 0.87233677 
Смежные вопросы