объединение нескольких фреймов данных в один расширенный фрейм - PullRequest
9 голосов
/ 20 января 2011

У меня есть список фреймов данных, где каждый фрейм содержит одинаковые измерения для одной системы. Например.,

$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

Я играл с функциями reshape , merge и melt , но пока не нашел решения.

Спасибо за любые подсказки ...

Ответы [ 2 ]

9 голосов
/ 20 января 2011

Используйте 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
7 голосов
/ 20 января 2011

вы можете использовать melt, cast, 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...