将列表转换为缺少某些列值的data.frame的更快方法

将列表转换为缺少某些列值的data.frame的更快方法,r,data-manipulation,R,Data Manipulation,我有这张单子 > head(train) [[1]] [[1]]$Physics [1] 8 [[1]]$Chemistry [1] 7 [[1]]$PhysicalEducation [1] 3 [[1]]$English [1] 4 [[1]]$Mathematics [1] 6 [[1]]$serial [1] 195490 . . [[6]] [[6]]$Physics [1] 2 [[6]]$Chemistry [1] 1 [[6]]$Biology [1] 2

我有这张单子

> head(train)
[[1]]
[[1]]$Physics
[1] 8

[[1]]$Chemistry
[1] 7

[[1]]$PhysicalEducation
[1] 3

[[1]]$English
[1] 4

[[1]]$Mathematics
[1] 6

[[1]]$serial
[1] 195490

.
.
[[6]]
[[6]]$Physics
[1] 2

[[6]]$Chemistry
[1] 1

[[6]]$Biology
[1] 2

[[6]]$English
[1] 4

[[6]]$Mathematics
[1] 8

[[6]]$serial
[1] 182318
每个子列表都有这12个元素中的任意5个元素,还有一个额外命名的
serial

columns <- c("Physics", "Chemistry", "PhysicalEducation", "English", 
             "Mathematics", "serial", "ComputerScience", "Hindi", "Biology", 
             "Economics", "Accountancy", "BusinessStudies")
这是可复制的代码

train <- [{\"Physics\":8,\"Chemistry\":7,\"PhysicalEducation\":3,\"English\":4,\"Mathematics\":6,\"serial\":195490},{\"Physics\":1,\"Chemistry\":1,\"PhysicalEducation\":1,\"English\":3,\"Mathematics\":3,\"serial\":190869},{\"Physics\":1,\"Chemistry\":2,\"PhysicalEducation\":2,\"English\":1,\"Mathematics\":2,\"serial\":3111},{\"Physics\":8,\"Chemistry\":7,\"PhysicalEducation\":6,\"English\":7,\"Mathematics\":7,\"serial\":47738},{\"Physics\":1,\"Chemistry\":1,\"PhysicalEducation\":1,\"English\":3,\"Mathematics\":2,\"serial\":85520},{\"Physics\":2,\"Chemistry\":1,\"Biology\":2,\"English\":4,\"Mathematics\":8,\"serial\":182318},{\"Physics\":3,\"Chemistry\":4,\"PhysicalEducation\":5,\"English\":5,\"Mathematics\":8,\"serial\":77482},{\"Accountancy\":2,\"BusinessStudies\":5,\"Economics\":3,\"English\":6,\"Mathematics\":7,\"serial\":152940},{\"Physics\":5,\"Chemistry\":6,\"Biology\":7,\"English\":3,\"Mathematics\":8,\"serial\":132620}]
train <- rjson::fromJSON(train)

train您可以通过组合
Reduce
Map
在基本R中完成此操作

数据

这是一个与您的结构匹配的数据集

set.seed(1234)
temp <- replicate(7, setNames(replicate(7, sample(1:10, 1), simplify=FALSE), letters[1:7]),
                  simplify=FALSE)

其中
data.frame
使用内部元素构造data.frames<代码>映射
将此应用于外部列表的每个元素,从而生成data.frames列表。最后,
Reduce
rbind
s列表中的data.frames并生成单个data.frames。

您可以通过组合
Reduce
Map
在基数R中完成此操作

数据

这是一个与您的结构匹配的数据集

set.seed(1234)
temp <- replicate(7, setNames(replicate(7, sample(1:10, 1), simplify=FALSE), letters[1:7]),
                  simplify=FALSE)

其中
data.frame
使用内部元素构造data.frames<代码>映射将此应用于外部列表的每个元素,从而生成data.frames列表。最后,
Reduce
rbinds列表中的data.frames并生成一个data.frames。

作为起点,您可以使用purrr::map,如下所示:

示例数据集:

x <- list(list(physics=8,
               Chemistry=7,
               PhysicalEducation=3,
               English=4,
               serial=195490),
          list(physics=2,
               Chemistry=1,
               Biology=2,
               English=4,
               Mathematics=8,
               serial=182318))
如果您想了解这是如何工作的,可以查看下面较长的解决方案

Sol.2[手动分配]

-选择每列的值:

z <- data.frame(
    serial = map_dbl(x,"serial",.null=NA),
    Biology = map_dbl(x,"Biology",.null=NA),
    Chemistry = map_dbl(x,"Chemistry",.null=NA)
        )
Sol.3[预定义数据帧和for循环]

  • 创建具有固定大小的数据帧


    zz作为起点,您可以使用purrr::map,如下所示:

    示例数据集:

    x <- list(list(physics=8,
                   Chemistry=7,
                   PhysicalEducation=3,
                   English=4,
                   serial=195490),
              list(physics=2,
                   Chemistry=1,
                   Biology=2,
                   English=4,
                   Mathematics=8,
                   serial=182318))
    
    如果您想了解这是如何工作的,可以查看下面较长的解决方案

    Sol.2[手动分配]

    -选择每列的值:

    z <- data.frame(
        serial = map_dbl(x,"serial",.null=NA),
        Biology = map_dbl(x,"Biology",.null=NA),
        Chemistry = map_dbl(x,"Chemistry",.null=NA)
            )
    
    Sol.3[预定义数据帧和for循环]

    • 创建具有固定大小的数据帧


      zz您是否可以添加一个代码来复制一个样本,而不是从它开始编写一个新的示例?尝试
      do.call(plyr::rbind.fill,lappy(train,data.frame))
      dplyr::bind_rows(lappy(train,data.frame))
      。请检查我编辑的答案(sol.1)使用purrr:map,您是否可以添加一个代码来复制一个示例,而不是从它开始编写一个新的示例?尝试
      do.call(plyr::rbind.fill,lappy(train,data.frame))
      dplyr::bind_rows(lappy(train,data.frame))
      。请用purrr:map检查我编辑的答案(sol.1)
      > zzz
        Physics Chemistry PhysicalEducation English Mathematics serial ComputerScience Hindi Biology Economics
      1      NA         7                 3       4          NA 195490              NA    NA      NA        NA
      2      NA         1                NA       4           8 182318              NA    NA       2        NA
        Accountancy BusinessStudies
      1          NA              NA
      2          NA              NA
      
      z <- data.frame(
          serial = map_dbl(x,"serial",.null=NA),
          Biology = map_dbl(x,"Biology",.null=NA),
          Chemistry = map_dbl(x,"Chemistry",.null=NA)
              )
      
      > z
        serial Biology Chemistry
      1 195490      NA         7
      2 182318       2         1
      >
      
      > zz
        Physics Chemistry PhysicalEducation English Mathematics serial ComputerScience Hindi Biology Economics
      1      NA         7                 3       4          NA 195490              NA    NA      NA        NA
      2      NA         1                NA       4           8 182318              NA    NA       2        NA
        Accountancy BusinessStudies
      1          NA              NA
      2          NA              NA