【问题标题】:Converting list to dataframe for use in ggplot将列表转换为数据框以在 ggplot 中使用
【发布时间】:2013-07-06 16:11:13
【问题描述】:

我有一个名为 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 无法绘制列表,所以我尝试使用 res2 <- data.frame(res)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 以创建箱线图的任何帮助都会非常有帮助。提前致谢!

--尼尔

【问题讨论】:

    标签: r list ggplot2


    【解决方案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'))
    

    【讨论】:

    • 太好了!尽管是否可以将两列中的值(例如 275.06、273.93)列在一个列中?这样我可以问ggplotggplot(res, aes(x=iter, y=X1)) + geom_boxplot())
    • 再次感谢! 'x' 列是否可以分成两列,使得“喂食时间”(即 275、273、126 等)和“行进距离”(即 5.7、5.75、4.86 等)是分开的?否则,我不确定 ggplot 如何识别要绘制的变量。
    • @user2359494 试着理解我的回答!我不会为你做这项工作。进行转置,你会得到你想要的:do.call(rbind,lapply(seq_along(ll),function(x)data.frame(x= t((ll[[x]])), interst=interest[x])))
    • 非常感谢您的帮助。
    【解决方案2】:

    我愿意

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

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

    【讨论】:

    • 不可能是同一类型的数据
    • 为什么?对我来说,它是 3 个 data.frames 的列表..?
    • 从显示上看,它们最初可能是矩阵
    猜你喜欢
    • 2020-04-15
    • 2020-04-17
    • 2022-11-14
    • 2011-05-12
    相关资源
    最近更新 更多