2014-05-08 25 views
2

我試圖從多個操作的輸出中創建數據集。但我不知道如何自動化這個。複製函數將會很好,但是需要執行多個操作才能獲得單個新數據點,即調整R平方& F-statistic。如何從R輸出創建數據幀

R代碼裏面:

#make dataframe with random data 
A<-as.integer(round(runif(20, min=1, max=10))) 
dim(A) <- c(10,2) 
A<-as.data.frame(A) 
#extract F-statistic 
summary(lm(formula=V1~V2,data=A))$fstatistic[1] 
#extract adjusted R squared 
summary(lm(formula=V1~V2,data=A))$adj.r.squared 
#repeat 100 times and make a dataframe of the unique extracted output, e.g. 2 columns 100 rows 
?????????????? 
+0

你快到了......'replicate'可以正常工作。只需在'c()'中包裝這兩個彙總輸出。 (複製(100,{我想做的事情; c(summary(lm(formula = V1〜V2,data = A))$ fstatistic [1],summary(lm(formula = V1〜V2,data = A)) $ adj.r.squared)})' – jbaums

回答

0

只是包裝它在一個for循環。

df <- as.data.frame(matrix(0, 100, 2)) 

for (i in 1:100){ 
A<-as.integer(round(runif(20, min=1, max=10))) 
dim(A) <- c(10,2) 
A<-as.data.frame(A) 
#extract F-statistic 
df[i, 1] <- summary(lm(formula=V1~V2,data=A))$fstatistic[1] 
#extract adjusted R squared 
df[i, 2] <- summary(lm(formula=V1~V2,data=A))$adj.r.squared 
} 

中提琴。

0

replicate函數將正常工作。首先,編寫一個函數來模擬一次迭代。

one.sim <- function() { 
    A <- matrix(as.integer(runif(20, min=1, max=10)), nrow=10) 
    A <- as.data.frame(A) 
    m1.summary <- summary(lm(V1 ~ V2, data=A)) 
    return(c(fstatistic=unname(m1.summary$fstatistic[1]), 
      adj.r.squared=m1.summary$adj.r.squared)) 
} 

然後使用此功能在重複:

results <- t(replicate(100, one.sim())) 
1

應用超過5個的數據幀的線性模型...

隨着replicate,它會像

> replicate(5, { 
     A <- data.frame(rnorm(5), rexp(5)) 
     m <- lm(formula = A[,1] ~ A[,2], data = A) 
     c(f = summary(m)$fstatistic[1], adjR = summary(m)$adj.r.squared) 
    }) 
##    [,1]  [,2]  [,3]  [,4]  [,5] 
## f.value 0.4337426 1.3524681 1.17570087 3.8537837 0.04583862 
## adjR -0.1649097 0.0809812 0.04207698 0.4163808 -0.31326721 

你可以用t()來包裝這個以獲得長表格矩陣。

你也可以使用廣受歡迎的do.call(rbind, lapply(...))方法,

> do.call(rbind, lapply(seq(5), function(x){ 
     A <- data.frame(rnorm(5), rexp(5)) 
     m <- lm(formula = A[,1] ~ A[,2], data = A) 
     c(f = summary(m)$fstatistic[1], adjR = summary(m)$adj.r.squared) 
    })) 
##   f.value  adjR 
## [1,] 1.9820243 0.19711351 
## [2,] 21.6698543 0.83785879 
## [3,] 4.4484639 0.46297652 
## [4,] 0.9084373 -0.02342693 
## [5,] 0.0388510 -0.31628698 

您還可以使用sapply

> sapply(seq(5), function(x){ 
     A <- data.frame(rnorm(5), rexp(5)) 
     m <- lm(formula = A[,1] ~ A[,2], data = A) 
     c(f = summary(m)$fstatistic[1], adjR = summary(m)$adj.r.squared) 
    }) 
##     [,1]  [,2]   [,3]  [,4]  [,5] 
## f.value  0.07245221 0.2076504 0.0003488657 58.5524139 0.92170453 
## adjR  -0.30189169 -0.2470187 -0.3331783000 0.9350147 -0.01996465 

請記住,這些都將返回一個matrix,所以一個as.data.frame的包裝件可如果你想得到data.frame結果,那麼應該是適當的。