【问题标题】:Convert the Multiple Lists into one single data Frame in r将多个列表转换为 r 中的一个数据帧
【发布时间】:2019-11-23 15:55:17
【问题描述】:

我有多个列表,如下所示:我在将这些列表转换为 R 中的数据框时遇到问题

我在 R 中编写了一些代码将列表转换为数据帧,但给出了错误的数据帧

### the first list
b1

[[1]]
[1] "math"

[[2]]
[1] "write"

[[3]]
[1] 0.6439442

[[4]]
[1] 0.2939780 0.8416635

[[5]]
     2.5%     97.5% 
0.5517048 0.7156524 


## second list
b2
[[1]]
[1] "math"

[[2]]
[1] "read"

[[3]]
[1] 0.663126

[[4]]
[1] 0.3242639 0.8511580

[[5]]
     2.5%     97.5% 
0.5716105 0.7384209 

3 third list
b3

[[1]]
[1] "science"

[[2]]
[1] "write"

[[3]]
[1] 0.5812035

[[4]]
[1] 0.1995946 0.8097306

[[5]]
     2.5%     97.5% 
0.4791782 0.6721795 



像这样有更多 100 个列表,我正在尝试将它们转换为数据框。

为此,我编写了一个代码来将多个列表转换为 R 中的 Data Frame

已将所有列表合并为一个列表,便于在数据框中转换

list_full <- list(b1,b2,b2,b4)
f1 <- lapply(list_full,function(x){

           max.length<-max(sapply(x, length))
           data.frame(sapply(x, function(v) {c(v, rep(NA, max.length-length(v)))}), stringsAsFactors = FALSE)
           })


library(dplyr)
j<-bind_rows(f1, .id = 'ID')

我们执行我得到错误数据帧的代码,如下所示,其中第二个值存储在分隔行中。看了就知道了

    ID  X1      x2       x3     x4            x5
1   1   math    write   0.64394 0.2939780   0.55170476
2   1   NA      NA     NA       0.841663    0.7156523
3   2   math    read    0.6631  0.324263    0.57161
4   2   NA      NA       NA     0.851157    0.7384209
5   3   math    read    0.6631  0.3242      0.5716104
6   3   NA       NA     NA      0.85115     0.7384
7   4   science read    0.644   0.2963      0.552
8   4   NA      NA      NA      0.842       0.72

这是我目前面临的问题,所以请提供更好的代码来解决这个问题

最终的数据框应如下所示:


x1         x2        x3               x4               x5
math       wirte     0.643    (0.29, 0.84)     (0.55, 0.72)
math       read       0.66    (0.32 0.851)     (0.57 0.74)
science    write     0.581    (0.19 0.80)       (0.47 0.67)

【问题讨论】:

    标签: r list dataframe type-conversion


    【解决方案1】:

    这里尝试使用列表中的一些Mapping 和结果中的一些paste-ing。

    allb <- do.call(Map, c(rbind, list(b1,b2,b3)))
    allb <- lapply(allb, function(x) {
      if(ncol(x) > 1) paste0("(", apply(x,1,paste,collapse=", "), ")") else
                      x 
    })
    as.data.frame(allb, col.names = paste0("x", seq_along(allb)))
    #       x1    x2        x3                     x4                     x5
    #1    math write 0.6439442  (0.293978, 0.8416635) (0.5517048, 0.7156524)
    #2    math  read 0.6631260  (0.3242639, 0.851158) (0.5716105, 0.7384209)
    #3 science write 0.5812035 (0.1995946, 0.8097306) (0.4791782, 0.6721795)
    

    源列表的位置:

    b1 <- list(
      "math",
      "write",
      0.6439442,
      c(0.2939780, 0.8416635),
      setNames(c(0.5517048, 0.7156524), c("2.5%","97.5%"))
    )
    
    b2 <- list(
      "math",
      "read",
      0.663126,
      c(0.3242639, 0.8511580),
      setNames(c(0.5716105, 0.7384209), c("2.5%","97.5%"))
    )
    
    b3 <- list(
      "science",
      "write",
      0.5812035,
      c(0.1995946, 0.8097306),
      setNames(c(0.4791782, 0.6721795), c("2.5%","97.5%"))
    )
    

    【讨论】:

    • 我得到了答案,但我需要一些修改我需要得到答案 (0.29, 0.84) ,丢失了
    • @vka - 它在x4 中 - 或者你的意思是你需要对数字进行四舍五入?您可以在整个块周围添加round(),或者如果您愿意,可以通过将collapse=" " 更改为您想要的任何内容来更改分隔符。
    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-09
    • 2020-07-10
    • 1970-01-01
    相关资源
    最近更新 更多