2011-01-20 145 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