我想将打印函数输出转换为数据框对象。我使用了这段代码,但我只将最后一行作为数据帧行。 这是一个玩具数据框:
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
答案 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