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

beh*_*has 9 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
Run Code Online (Sandbox Code Playgroud)

现在,我想使用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
Run Code Online (Sandbox Code Playgroud)

我玩了重塑,合并融合功能,但尚未找到解决方案.

谢谢你的任何提示......

Ric*_*ton 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)
Run Code Online (Sandbox Code Playgroud)

忘记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
Run Code Online (Sandbox Code Playgroud)

  • `do.call(rbind,data_list)`的更快替代方法是`plyr :: rbind.fill(data_list)` (4认同)

koh*_*ske 7

你可以使用融化,强制转换,ldply,就像Richie建议的那样,ggplot2.

预先,

library(ggplot2) # load reshape, plyr, and ggplot2
Run Code Online (Sandbox Code Playgroud)

首先,使用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")
Run Code Online (Sandbox Code Playgroud)

在我看来,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")
Run Code Online (Sandbox Code Playgroud)