2014-01-06 79 views
2

我使用「by」函數來計算大量圖(其中有4個變量)的相關矩陣,並將結果保存在數據框中,像這樣:保存使用「by」函數生成的數據幀中保存的數據

results <- by(data, data$graphNumber, cor) 

其中: data是我的原始圖形數據,data$graphNumber是我用於窗格的結果和cor是用於創建相關矩陣

results樣品的函數的可變:

d$graphNumber: 1 
       x   y    z   T 
x    1.0000000 0.9445139 0.9967193 0.9753503 
y    0.9445139 1.0000000 0.9630660 0.9853882 
z    0.9967193 0.9630660 1.0000000 0.9897238 
T    0.9753503 0.9853882 0.9897238 1.0000000 
------------------------------------------------------------------------------- 
d$graphNumber: 2 
       x   y   z   T 
x    1.0000000 0.9075414 0.9587088 0.9140054 
y    0.9075414 1.0000000 0.9833022 0.9942477 
z    0.9587088 0.9833022 1.0000000 0.9768249 
T    0.9140054 0.9942477 0.9768249 1.0000000 
------------------------------------------------------------------------------- 
... 

我現在想要將結果保存爲CSV格式。我已經嘗試使用:

write.table(results,"data.csv") 

但這返回一個錯誤:

Error in as.data.frame.default(results[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : 
    cannot coerce class '"by"' into a data.frame 

我可以用寫的每一個人矩陣:

write.table(results[1],"data.csv") 

不過,我想寫出所有結果以某種方式識別每個矩陣對應的圖形爲一個CSV文件。結果


結構,str(results)

List of 1013 
$ 1 : num [1:4, 1:4] 1 0.945 0.997 0.975 0.945 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:4] "x" "y" "z" "T" 
    .. ..$ : chr [1:4] "x" "y" "z" "T" 
$ 2 : num [1:4, 1:4] 1 0.908 0.959 0.914 0.908 ... 
    ..- attr(*, "dimnames")=List of 2 
    .. ..$ : chr [1:4] "x" "y" "z" "T" 
    .. ..$ : chr [1:4] "x" "y" "z" "T" 

回答

3
# generate sample data 
n <- 1000; graphNum <- 4 
data <- data.frame(x=runif(n, 1, 100), 
        y=runif(n, 1, 100), 
        graphNumber=gl(graphNum,n/graphNum)) 
(results <- by(data[,1:2], data$graphNumber, cor)) 

# to data frame 
(df <- do.call(rbind, lapply(results, as.data.frame))) 
#    x   y 
# 1.x 1.00000000 -0.13468673 
# 1.y -0.13468673 1.00000000 
# 2.x 1.00000000 -0.04512667 
# 2.y -0.04512667 1.00000000 
# 3.x 1.00000000 0.03609621 
# 3.y 0.03609621 1.00000000 
# 4.x 1.00000000 -0.04193474 
# 4.y -0.04193474 1.00000000 

後來,你可以單獨在rownames的graphNum和VAR通過

strsplit(row.names(df), "\\.") 
+0

令人驚歎。這個作品 – joshlk

+0

@Josh PS:也許你更喜歡'save(results,file =「test.RData」)''和'load(「test.RData」)'而不是類型轉換。 – lukeA

2

您可以通過使用do.callrbind轉換爲data.frame

resultsdf <- as.data.frame(do.call(rbind,results)) 

,但你必須在使用之前修復duplcate行名稱:

rownames(resultsdf) <- paste(rownames(resultsdf),rep(names(results),sapply(results,nrow)), sep=".") 

使用mtcars數據爲例:

results <- by(mtcars[c("mpg","disp","hp")],mtcars$cyl,cor) 

resultsdf 
       mpg  disp   hp 
mpg.4 1.0000000 -0.8052361 -0.5235034 
disp.4 -0.8052361 1.0000000 0.4346051 
hp.4 -0.5235034 0.4346051 1.0000000 
mpg.6 1.0000000 0.1030827 -0.1270678 
disp.6 0.1030827 1.0000000 -0.5136284 
hp.6 -0.1270678 -0.5136284 1.0000000 
mpg.8 1.0000000 -0.5197670 -0.2836357 
disp.8 -0.5197670 1.0000000 0.1182556 
hp.8 -0.2836357 0.1182556 1.0000000 
+0

+1此工作,但結果仍然是矩陣,而不是數據框。 –

+0

是的,你可以在它周圍包裝'as.data.frame',但是重複的行名會出錯,所以這些都需要改變。 – James

+0

@詹姆斯我想你鬆散的分組信息,不是嗎? – agstudy

0

一個選項來獲得一個data.frame是使用ddply

n = 100 
library(plyr) 
dfx <- data.frame(
    graphNumber = c(rep('A', 8), rep('B', 15), rep('C', 6)), 
    x = runif(n = 29, min = 18, max = 54), 
    y = runif(n = 29, min = 18, max = 54) 
) 
ddply(dfx, .(graphNumber), function(x){ 
    cor(x[,-1]) 
}) 

graphNumber   x   y 
1   A 1.00000000 0.54914531 
2   A 0.54914531 1.00000000 
3   B 1.00000000 -0.02346146 
4   B -0.02346146 1.00000000 
5   C 1.00000000 -0.86352644 
6   C -0.86352644 1.00000000 
0

你可能melt列表中的每個數據幀,然後轉換爲數據幀。

library(reshape2) 
library(plyr) 

results <- by(mtcars[ , 1:4], list(am = mtcars[, "am"]), cor) 
results 
# am: 0 
#    mpg  cyl  disp   hp 
# mpg 1.0000000 -0.7959989 -0.7926335 -0.8315065 
# cyl -0.7959989 1.0000000 0.8294544 0.8454881 
# disp -0.7926335 0.8294544 1.0000000 0.8343294 
# hp -0.8315065 0.8454881 0.8343294 1.0000000 
# ------------------------------------------------------------------------------------------------------ 
# am: 1 
#    mpg  cyl  disp   hp 
# mpg 1.0000000 -0.8259983 -0.8348954 -0.8006683 
# cyl -0.8259983 1.0000000 0.9408836 0.9004347 
# disp -0.8348954 0.9408836 1.0000000 0.9240353 
# hp -0.8006683 0.9004347 0.9240353 1.0000000 

results2 <- llply(results, melt) 
results2 
results3 <- ldply(results2) 
results3 

# .id Var1 Var2  value 
# 1 0 mpg mpg 1.0000000 
# 2 0 cyl mpg -0.7959989 
# 3 0 disp mpg -0.7926335 
# 4 0 hp mpg -0.8315065 
# 5 0 mpg cyl -0.7959989 
# 6 0 cyl cyl 1.0000000 
# ... 
# 18 1 cyl mpg -0.8259983 
# 19 1 disp mpg -0.8348954 
# 20 1 hp mpg -0.8006683 
# 21 1 mpg cyl -0.8259983 
# 22 1 cyl cyl 1.0000000