【问题标题】:convert list of list to a coerced dataframe将列表列表转换为强制数据框
【发布时间】:2017-01-11 16:29:19
【问题描述】:

这里生成的列表 x 列表如下:

    list1 <- list(NULL, as.integer(0))
    list2 <- list(NULL, as.integer(1))
    list3 <- list(1:5, 0:4)
    x <- list(a=list1, b=list2, c=list3)

x 的结构如下:

    str(x)
     List of 3
     $ a:List of 2
      ..$ : NULL
      ..$ : int 0
     $ b:List of 2
      ..$ : NULL
      ..$ : int 1
     $ c:List of 2
      ..$ : int [1:5] 1 2 3 4 5
      ..$ : int [1:5] 0 1 2 3 4

我正在尝试将其转换为强制数据帧。我第一次使用

   xc <- data.frame(lapply(x, as.numeric)

我收到以下错误

   Error in lapply(x, as.numeric) : 
     (list) object cannot be coerced to type 'double

实际上它只适用于 as.character 作为参数。

我的目标是达到具有以下结构的数据框:

   str(xc)

   'data.frame':    2 obs. of  3 variables:
    $ a: int  NA 0 ...
    $ b: int  NA 1 ...
    $ c: int [1:5] 1 2 3 4 5 int [1:5] 0 1 2 3 4

【问题讨论】:

  • 试试data.frame(lapply(x, unlist)) 请展示一个可重现的小例子
  • 错误(函数(...,row.names = NULL,check.rows = FALSE,check.names = TRUE,:参数暗示不同的行数:1434、1081、5465、95263 , 18705, 6206, 12085, 22000, 499
  • 好的,请展示一个使用 dput 的可重现的小示例,因为对于大数据单独来自 str 的数据结构尚不清楚
  • 我已经使用 do.call(rbind, x) 将列表转换为单个数据框,但没有示例我无法在这里进行测试。
  • 在操作列表之前,您可能必须将 NULL 替换为 NA,以防止生成的数组长度不同。

标签: r list dataframe


【解决方案1】:

我认为结果数据框的列必须是列表(这是可以处理多个向量和NULL值的类型)。

使用 dplyr 或 data.table 包可能是最简单的方法。 然后,您可以使用 as.data.frame 将其转换回基本 data.frame:

library(data.table)
xc <- as.data.table(x)

library(dplyr)
xc <- as_data_frame(x)

转换成base data.frame后,结果是一样的:

as.data.frame(xc)

#>      a    b             c
#> 1 NULL NULL 1, 2, 3, 4, 5
#> 2    0    1 0, 1, 2, 3, 4

列是列表:

str(as.data.frame(xc))

#> 'data.frame':    2 obs. of  3 variables:
#>  $ a:List of 2
#>   ..$ : NULL
#>   ..$ : int 0
#>  $ b:List of 2
#>   ..$ : NULL
#>   ..$ : int 1
#>  $ c:List of 2
#>   ..$ : int  1 2 3 4 5
#>   ..$ : int  0 1 2 3 4

【讨论】:

    猜你喜欢
    • 2020-04-17
    • 2022-11-14
    • 2021-03-22
    • 2015-11-14
    相关资源
    最近更新 更多