【问题标题】:Separate a tibble column containing a list into multiple rows in R将包含列表的 tibble 列分隔为 R 中的多行
【发布时间】:2021-05-25 15:05:03
【问题描述】:

我的情况的 MWE 与help documentation 中为tidyr::separate_rows 给出的示例非常相似)。此示例的简化版本是:

tibble(
  x = 1:3,
  y = c(list("3"), list("6, 7, 2"), list("4, 1"))       # Works
) %>%
separate_rows(y)

给了

# A tibble: 6 x 2
      x     y
  <int> <chr>
1     1     3
2     2     6
3     2     7
4     2     2
5     3     4
6     3     1

我的情况是y中的每个元素都是一个列表,尽管只有一个元素,它是一个向量。

tibble(
  x = 1:3,
  y = c(list(3), list(c(6, 7, 2)), list(c(4, 1)))     # Fails
) %>%
separate_rows(y)

这给了我错误:

Error: Can't combine `..1` <double> and `..2` <character>.

请注意,在这两种情况下,tibble 中的 y 列(separate_rows 之前)是 list 类。根据我在其他地方找到的建议,我尝试使用 unnestmutate_if(islist, ...) 但似乎无法让它们工作。

类似的问题还有很多,但我没有找到和这里完全一样的问题。

【问题讨论】:

    标签: r


    【解决方案1】:

    separate_rows 用于将连接的向量(不是列表列)分成单独的行。使用 unnest 中的 tidyr 将 list-col 的元素取消嵌套到行中。这行得通

    library(tibble)
    library(tidyr)
    tibble(
      x = 1:3,
      y = c(list(3), list(c(6, 7, 2)), list(c(4, 1))) 
    )
    #> # A tibble: 3 x 2
    #>       x y        
    #>   <int> <list>   
    #> 1     1 <dbl [1]>
    #> 2     2 <dbl [3]>
    #> 3     3 <dbl [2]>
    
    tibble(
      x = 1:3,
      y = c(list(3), list(c(6, 7, 2)), list(c(4, 1))) 
    ) %>% unnest(y)
    #> # A tibble: 6 x 2
    #>       x     y
    #>   <int> <dbl>
    #> 1     1     3
    #> 2     2     6
    #> 3     2     7
    #> 4     2     2
    #> 5     3     4
    #> 6     3     1
    

    如果您仍想使用separate_rows 将 list-column 的元素折叠为单个元素向量。但这会导致将 double 类型的元素强制转换为字符类型。

    tibble(
      x = 1:3,
      y = c(list(3), list(c(6, 7, 2)), list(c(4, 1))) 
    ) %>% 
      mutate(y = map_chr(y, ~paste(.x, collapse = ', '))) %>%
      separate_rows(y, sep = ', ')
    
    # A tibble: 6 x 2
          x y    
      <int> <chr>
    1     1 3    
    2     2 6    
    3     2 7    
    4     2 2    
    5     3 4    
    6     3 1
    

    【讨论】:

    • 谢谢。我以为我已经尝试过了——当我尝试 unnest 时,我一定搞砸了。但它有效。
    猜你喜欢
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多