将多个数据帧合并为一个扩展帧

时间:2011-01-20 14:50:39

标签: r

我有一个数据框列表,其中每个帧包含单个系统的相同类型的测量。如,

$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

我使用重塑合并融化功能,但尚未找到解决方案。

感谢任何提示......

2 个答案:

答案 0 :(得分:9)

使用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

答案 1 :(得分:7)

你可以使用熔化,强制转换,ldply,就像Richie建议的那样,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")