如何将打印功能输出到数据帧中

时间:2015-11-18 10:50:52

标签: r 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),第二个用于名称(目标,鸟类,狼) 我试图使用这个命令,但我只得到了打印输出的las行:

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

3 个答案:

答案 0 :(得分: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 :(得分: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中,您可以稍后再使用。

答案 2 :(得分: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