【问题标题】:Create list of lists from tibble in R (tidyverse)从 R 中的 tibble 创建列表列表(tidyverse)
【发布时间】:2020-07-24 14:33:54
【问题描述】:

我正在尝试做一些看起来很简单的事情,但我无法弄清楚。我有一个像这样的小标题:

> df <- tibble::tribble(
  ~col_a, ~col_b,
  1,      "A",   
  2,      "B",   
  3,      "C",   
)
> df
# # A tibble: 3 x 2
# col_a col_b
# <dbl> <chr>
#   1     A    
#   2     B    
#   3     C 

我想把它变成一个像这样的列表

> str(res_list)
# List of 3
# $ :List of 2
# ..$ col_a: num 1
# ..$ col_b: chr "A"
# $ :List of 2
# ..$ col_a: num 2
# ..$ col_b: chr "B"
# $ :List of 2
# ..$ col_a: num 3
# ..$ col_b: chr "C"

我使用基本applydplyr::rowwise 尝试了很多东西,但没有一个效果很好。在purrr::pmap 的文档中,我想我找到了答案:

f.   A function, formula, or vector (not necessarily atomic)...

If character vector, numeric vector, or list, it is converted to an extractor function. Character vectors index by name...

所以我想,很好,这应该可以工作:pmap(df, c("col_a", "col_b")) 并且应该为每个元素(行)提取这些列并返回提取列表的列表。但是当我运行时,我得到:

 Error in pluck(x, "col_a", "col_b", .default = NULL) : 
  argument "x" is missing, with no default 

我半理解这个错误,但我认为我正在关注文档中的用法。也许这只是 purrr 中的一个错误?

无论如何,欢迎对潜在的 purrr 错误进行评论,但实际上我只是想创建这个列表。非常感谢任何帮助。

【问题讨论】:

标签: r dplyr purrr tibble


【解决方案1】:

您可以使用group_split()(如果您愿意,也可以使用基本split()):

library(dplyr)
library(purrr)

df %>%
  group_split(row_number(), .keep = FALSE) %>%
  map(as.list)

str() 给出的位置:

List of 3
 $ :List of 2
  ..$ col_a: num 1
  ..$ col_b: chr "A"
 $ :List of 2
  ..$ col_a: num 2
  ..$ col_b: chr "B"
 $ :List of 2
  ..$ col_a: num 3
  ..$ col_b: chr "C"

或者:

lapply(split(df, 1:nrow(df)),
       as.list)

【讨论】:

  • 完美!谢谢你。我没有按行号考虑group_split()。出于某种原因,这感觉很像 SQL。 lapply 选项也有效,但它用行号命名列表的每个元素,这可能很好,但不太干净。谢谢!
【解决方案2】:

您可以使用asplit()

type.convert(lapply(asplit(df, 1), as.list), as.is = T)

by()

`attributes<-`(by(df, 1:nrow(df), as.list), NULL)

str() 都给

List of 3
 $ :List of 2
  ..$ col_a: int 1
  ..$ col_b: chr "A"
 $ :List of 2
  ..$ col_a: int 2
  ..$ col_b: chr "B"
 $ :List of 2
  ..$ col_a: int 3
  ..$ col_b: chr "C"

【讨论】:

  • 这在表面上看起来不错,但请注意对另一个答案的评论(虽然现在我看到该答案已被删除,所以请不要删除此答案)指出 lapply 如何神秘地转换一切都到一个字符向量。如果您的真实 tibble 比示例中的更复杂,这尤其糟糕。
  • @seth127 已修复。请检查。
  • 是的,这两个也可以。谢谢你的更新。
【解决方案3】:

我们可以使用pmap

library(purrr)
dflist <- df %>%
              pmap(~ list(...))
str(dflist)
#List of 3
# $ :List of 2
#  ..$ col_a: num 1
#  ..$ col_b: chr "A"
# $ :List of 2
#  ..$ col_a: num 2
#  ..$ col_b: chr "B"
# $ :List of 2
#  ..$ col_a: num 3
#  ..$ col_b: chr "C"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    相关资源
    最近更新 更多