r - 将列表列表强制到数据帧,但在列表列中保留*一些*元素

标签 r tibble

我正在寻找一种方法来可靠地将列表结构强制为 data.frametibble,同时将一个或多个列维护为列表列。考虑以下列表结构:

d = data.frame(x = 1:10, y = 1.5*(1:10) + rnorm(10))
ex = list(label = "A", number = 1L, model = lm(y ~ x, data = d))

这没有按预期工作:

lapply(ex, as_data_frame) %>% bind_rows()

因为“model”列中的 lm 对象在转换中被矢量化。但是,将模型包装在 list 中会得到预期的结果:

ex2 = list(label = "A", number = 1L, model = list(lm(y ~ x, data = d)))
as_data_frame(ex2)

不幸的是,我有一个用例,我事先不知道给定的列是否是列表。我正在使用一个输出类似以下内容的函数:

ex3 = list(
  list(label = "A", number = 1L, model = lm(y ~ x, data = d)),
  list(label = "B", number = 1L, model = lm(y ~ x + 0, data = d))
)
# won't work properly
lapply(ex3, as_data_frame) %>% bind_rows()

有没有办法阻止 data_frame 在转换为 tibble 时将对象矢量化?如果没有,我可以使用什么替代方法?

最佳答案

这是 tidyverse 的一个选项

library(tidyverse)
ex3 %>% 
 transpose %>% 
 map_if(~all(lengths(.) == 1), unlist) %>% 
 as_tibble
# A tibble: 2 x 3
#  label number model   
#   <chr>  <int> <list>  
#1 A          1 <S3: lm>
#2 B          1 <S3: lm>

对于第一种情况,将“模型”作为列表,然后使用as_tibble

ex$model <- list(ex$model)
as_tibble(ex)

关于r - 将列表列表强制到数据帧,但在列表列中保留*一些*元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49701573/

相关文章:

r - 如何优雅地跨越多个列进行 str_detect 并有条件地填充新列

r - lm : complete cases used even with predictors without missing data 中缺少数据行为

来自串联的 R 项目文件路径

r - igraph (R) 中仅在根和终端顶点上添加标签?

R:使用来自向量的列名创建空的 tibble/数据框

r - 如何使用 R 按模式识别列并将其转换为日期时间?

r - ggplot 中 geom_point (scale_colour_manual) 的填充和边框颜色

r - 使用 map/apply 函数迭代执行连接的整洁方法

r - 使用 dplyr 将 tibbles 列表除以 R 中的 tibbles 列表

r - 在 tidyverse 中,类 "tbl"和 "tbl_df"的对象有什么区别?