【问题标题】:coerce list with uneven matrices into tibble将具有不均匀矩阵的列表强制转换为 tibble
【发布时间】:2018-04-23 13:00:22
【问题描述】:

我有一个这样的列表:

lst <-
list(structure(c("1", "[19]"), .Dim = 1:2), structure("1", .Dim = c(1L, 
1L)), structure(c("1", "[41]"), .Dim = 1:2), structure(c("1", 
"[55]"), .Dim = 1:2), structure(c("1", "[56]"), .Dim = 1:2), 
    structure(c("1", "[84]"), .Dim = 1:2))

如何将其转换为 tibble 以便:

rslt <-
tibble(batch=c(1,1,1,1,1,1), id=c("[19]","","[41]","[55]","[56]","[84]"))

# A tibble: 6 x 2
  batch    id
  <dbl> <chr>
1     1  [19]
2     1      
3     1  [41]
4     1  [55]
5     1  [56]
6     1  [84]

【问题讨论】:

  • 试试library(tidyverse);lst %&gt;% map_df(~as.data.frame(.))
  • 它有效,但我收到以下警告消息:1: In bind_rows_(x, .id) : Unequal factor levels: coercing to character 2: In bind_rows_(x, .id) : binding character and factor vector, coercing into character vector 3: In bind_rows_(x, .id) : binding character and factor vector, coercing into character vector...
  • 我忘了添加stringsAsFactors=FALSE,即lst %&gt;% map_df(~as.data.frame(., stringsAsFactors=FALSE))
  • 我在下面发布了一个带有解释的解决方案
  • 仅供参考,这里的列表不是嵌套的

标签: r list tibble


【解决方案1】:

我们遍历lst 并将其转换为data.frame,因为它是matrix。通常,如果尺寸相同,使用 do.call(rbind, lst) 应该可以工作。但是,这里就不一样了。使用来自purrrmap_dfr,我们循环遍历每个lst 元素,应用函数as.data.frame 将其转换为data.frame,同时,我们得到一个单独的数据集,因为我们正在使用map_dfr

map_dfr() 和 map_dfc() 返回由行绑定创建的数据帧和 列绑定分别。他们需要安装 dplyr。

library(purrr)
map_dfr(lst, ~as.data.frame(., stringsAsFactors=FALSE))

注意:它为不存在的元素返回 NA,它比有空白元素更好

【讨论】:

  • @Sotos 我认为它略有不同,因为它是vectors 中的list
  • ~as.data.frame 中的波浪线 ~ 是做什么用的?
  • 不使用管道%&gt;%,为什么不能像这样简单地将(.) 替换为lstmap_df(~as.data.frame(lst))
  • @Sati 不行,因为map_df 需要一个.f.x 这是函数和对象。即map_dfr(.x, .f, ..., .id = NULL) 只有map_df(~as.data.frame(lst)) 只有..f
【解决方案2】:

plyr包里还有一个很方便的函数可以轻松搞定,

plyr::rbind.fill(lapply(lst, as.data.frame))

#  V1   V2
#1  1 [19]
#2  1 <NA>
#3  1 [41]
#4  1 [55]
#5  1 [56]
#6  1 [84]

【讨论】:

    猜你喜欢
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多