2011-01-20 140 views
8

我有一個數據幀列表,其中每個幀包含單個系統的相同類型的測量。例如,將幾個數據幀合併到一個擴展幀中

$system1       
       file cumSize  cumloadTime  query1 
1 ../data/data1.dat 100000  158.1000  0.4333333 
2 ../data/data2.dat 200000  394.9000  0.5000000 
3 ../data/data3.dat 250000  561.8667  0.6666667 

$system2       
       file cumSize  cumloadTime  query1 
1 ../data/data1.dat 100000  120.1000  0.4333333 
2 ../data/data2.dat 200000  244.9000  0.4500000 
3 ../data/data3.dat 250000  261.8667  0.2666667 

現在我想使用matplot命令顯示在單獨的圖,這些數據幀的幾個方面。因此,我需要於上述輸入數據結構轉換爲下面的輸出結構:

$cumloadTime 

cumSize  system1  system2 
100000  158.1000 120.1000 
200000  394.9000 244.9000 
250000  561.8667 261.8667 

$query1 

cumSize  system1  system2 
100000  0.4333333 0.4333333 
200000  0.5000000 0.4500000 
250000  0.6666667 0.2666667 

我玩與周圍的重塑合併,和熔融功能,但還沒有找到解決辦法。

感謝您的任何提示...

+0

看你的變量外殼:我認爲你的意思`cumLoadTime`而不是`cumloadTime`。 – 2011-01-20 15:11:11

回答

8

使用rbind創建一個包含所有一個數據幀。

data_list <- list() 
data_list[["system1"]] <- read.table(tc <- textConnection("file cumSize  cumloadTime  query1 
1 ../data/data1.dat 100000  158.1000  0.4333333 
2 ../data/data2.dat 200000  394.9000  0.5000000 
3 ../data/data3.dat 250000  561.8667  0.6666667"), header = TRUE); close(tc) 

data_list[["system2"]] <- read.table(tc <- textConnection("file cumSize  cumloadTime  query1 
1 ../data/data1.dat 100000  120.1000  0.4333333 
2 ../data/data2.dat 200000  244.9000  0.4500000 
3 ../data/data3.dat 250000  261.8667  0.2666667"), header = TRUE); close(tc) 

for(n in names(data_list)) data_list[[n]]$system <- n 

all_data <- do.call(rbind, data_list) 

忘記matplot,使用ggplot代替,例如,

p1 <- ggplot(all_data, aes(cumSize, cumloadTime, color = system)) + geom_line(); p1 
p2 <- ggplot(all_data, aes(cumSize, query1, color = system)) + geom_line(); p2 
+4

「do.call(rbind,data_list)」的更快替代方法是`plyr :: rbind.fill(data_list)` – hadley 2011-01-20 20:44:33

7

你可以使用熔融,鑄造,ldply,和裏奇建議,GGPLOT2。

事前,

library(ggplot2) # load reshape, plyr, and ggplot2 

首先,使用matplot,

d2 <- ldply(data_list) 
cast(d2, cumSize~.id, value_var="cumloadTime") 
cast(d2, cumSize~.id, value_var="query1") 
matplot(d.cum, type="l") 
matplot(d.que, type="l") 
在我看來

,GGPLOT2將更好地工作:

d3 <- melt(d2, measure=c("cumloadTime", "query1")) 
ggplot(d3, aes(cumSize, value, colour=.id)) + geom_line() + 
    facet_wrap(~variable, nrow=2, scale="free_y") 
+1

+1用於說明`melt/cast/ldply`的使用 – 2011-01-20 15:35:04