2011-01-20 3 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'. –

ответ

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)' is 'plyr :: rbind.fill (data_list)' – hadley

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' –

Смежные вопросы