将列表转换为dataframe以在ggplot中使用

时间:2013-07-06 16:11:14

标签: r list ggplot2

我有一个名为res的列表,如下所示:

[[1]]
     [,1]     [,2]    
[1,] 275.0637 273.9386
[2,] 5.707791 5.755798

[[2]]
     [,1]     [,2]    
[1,] 126.8435 59.08806
[2,] 4.867521 3.258545

[[3]]
     [,1]     [,2]    
[1,] 23.50188 60.96321
[2,] 2.036354 3.737291

该列表包含模拟运行的结果共6次。我将感兴趣的参数设置为三个不同的值,'0'(即,[[1]]),'25'(即[[2]])和'50'(即[[3]] )。由于该模型包含大量随机性,因此我为每个值运行模型两次(即[,1],[,2])。我要求模型记录每次迭代的两次结果,“时间进给”(即[1,]和“行进距离”(即[2,])。最后,我将为每个变量设置迭代模型30次。我想使用ggplot创建一个箱形图,显示三个模拟设置(即0,25,50)中每个模拟设置的“时间进给”和“行进距离”。我相信ggplot可以我没有绘制列表,因此我尝试使用resres2 <- data.frame(res)转换为数据框,如下所示:

        X1       X2     X1.1     X2.1     X1.2     X2.2
1 275.0637 273.9386 126.8435 59.08806 23.50188 60.96321
2 5.707791 5.755798 4.867521 3.258545 2.036354 3.737291

这对我来说并不合适,因为现在所有三个模拟的结果都在同一行。将这些数据导入ggplot以创建箱形图的任何帮助都会非常有用。提前谢谢!

- 尼尔

2 个答案:

答案 0 :(得分:1)

假设ll是您的列表,您可以像这样使用do.callrbind

do.call(rbind,lapply(seq_along(ll),
        function(x)data.frame(ll[[x]],iter=x)))

           X..1.      X..2. iter
[1,]  275.063700 273.938600    1
[2,]    5.707791   5.755798    1
[1,]1 126.843500  59.088060    2
[2,]1   4.867521   3.258545    2
[1,]2  23.501880  60.963210    3
[2,]2   2.036354   3.737291    3
经过澄清后

编辑

interest <- c(0,25,50)
 do.call(rbind,lapply(seq_along(ll),
        function(x)data.frame(x= unlist(ll[[x]]),interst=interest[x])))

                                               interst=interest[x] .... [TRUNCATED] 

                 x interst
X..1.1  275.063700       0
X..1.2    5.707791       0
X..2.1  273.938600       0
X..2.2    5.755798       0
X..1.11 126.843500      25
X..1.21   4.867521      25
X..2.11  59.088060      25
X..2.21   3.258545      25
X..1.12  23.501880      50
X..1.22   2.036354      50
X..2.12  60.963210      50
X..2.22   3.737291      50

编辑,因为OP不提供数据ll:

res <- list(read.table(text='
     [,1]     [,2]    
[1,] 275.0637 273.9386
[2,] 5.707791 5.755798'),
read.table(text='
     [,1]     [,2]    
[1,] 126.8435 59.08806
[2,] 4.867521 3.258545'),
read.table(text='
     [,1]     [,2]    
[1,] 23.50188 60.96321
[2,] 2.036354 3.737291'))

答案 1 :(得分:0)

我愿意

names(res) = c("0", "25", "50")
m = reshape2::melt(res, id = 1)

但也许它不起作用,我在脑海里尝试过,因为你没有提供可用形式的数据。