【问题标题】:change list within list to dataframe for statistical analysis将列表中的列表更改为数据框以进行统计分析
【发布时间】:2015-10-16 07:15:50
【问题描述】:

我有以下列表结构:

[[1]]
[[1]][[1]]
a b c d
1 2 3 5
[[1]][[2]]
a b c d
2 5 3 5
[[2]]
[[2]][[1]]
a b c d
8 2 3 5
[[2]][[2]]
a b c d
7 5 3 1

str(fit)
List of 2
 $ :List of 2
  ..$ : Named num [1:20] 1 2 3 5 ...
  .. ..- attr(*, "names")= chr [1:20] "a" "b" "c" "d" ...
  ..$ : Named num [1:20] 2 5 3 5  ...
  .. ..- attr(*, "names")= chr [1:20] "a" "b" "c" "d" ...

内容是列表中的每个列表都是数字结构。

我想在数据框中更改它,如下所示:

NA NA a b c d
 1  1 1 2 3 5
 1  2 2 5 3 5
 2  1 8 2 3 5
 2  2 7 5 3 1

(不过,NA 可以替换为 v1 v2,如果每个数据框都必须有一个名称。)

我想知道这是否可能。

【问题讨论】:

  • 请使用dput显示数据
  • 这通常使用 do.call(rbind, YourList) 完成,但不会看到您的数据...
  • @user1945827 不适用于列表列表。可能是do.call(rbind,do.call(c, fit))
  • 好吧,在问这个问题之前我真的做过研究吗?是的。我真的了解解决方案吗?没有。
  • 什么是你不明白的,什么是不适合你的?

标签: r list dataframe


【解决方案1】:

这在某种程度上是对 cme​​ts 中提供的内容的扩展,同时使用了 data.table 包中的 rbindlist 函数(您需要 CRAN 上的最新版本)

library(data.table) # v 1.9.6+
rbindlist(
  lapply(fit, function(x) {
    temp <- do.call(rbind, x) 
    cbind.data.frame(V2 = 1:nrow(temp), temp)
   }
  ), idcol = "V1")
#    V1 V2 a b c d
# 1:  1  1 1 2 3 5
# 2:  1  2 2 5 3 5
# 3:  2  1 8 2 3 5
# 4:  2  2 7 5 3 1

如果您在每个列表中始终有两个元素且只有一行,则可以避免创建 temp,而只需使用 cbind.data.frame(V2 = 1:2, do.call(rbind, x))


数据

fit <- list(list(c(a = 1,b = 2,c = 3,d = 5), 
                 c(a = 2,b = 5,c = 3,d = 5)),
            list(c(a = 8,b = 2,c = 3,d = 5), 
                 c(a = 7,b = 5,c = 3,d = 1)))

【讨论】:

    【解决方案2】:

    或者在base R中,你可以这样做:

    do.call(rbind, 
            lapply(seq(length(fit)), 
                   function(x){
                      cbind(v1=rep(x, length(fit[[x]])),
                            t(sapply(seq(length(fit[[x]])), 
                                     function(y, x){
                                         c(v2=y, fit[[x]][[y]])
                                     }, x=x)))
                    }))
    #     v1 v2 a b c d
    #[1,]  1  1 1 2 3 5
    #[2,]  1  2 2 5 3 5
    #[3,]  2  1 8 2 3 5
    #[4,]  2  2 7 5 3 1
    

    不过我不会赌效率...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 2021-11-07
      相关资源
      最近更新 更多