【问题标题】:merging several data frames into a single expanded frame将多个数据帧合并为一个扩展帧
【发布时间】:2011-01-20 14:50:38
【问题描述】:

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

$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

现在我想使用 ma​​tplot 命令在单独的图中显示这些数据帧的几个方面。因此我需要将上面的输入数据结构转化为如下的输出结构:

$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

我尝试了 reshapemergemelt 函数,但还没有找到解决方案。

感谢您的任何提示...

【问题讨论】:

  • 注意你的变量大小写:我想你的意思是cumLoadTime而不是cumloadTime

标签: r


【解决方案1】:

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

【讨论】:

  • do.call(rbind, data_list) 的更快替代方案是 plyr::rbind.fill(data_list)
【解决方案2】:

您可以使用 melt、cast、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")

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-31
    • 2022-07-20
    • 2020-07-28
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多