【问题标题】:How to separate a column list of fixed size X to X different columns?如何将固定大小 X 的列列表分隔到 X 不同的列?
【发布时间】:2017-06-12 07:41:55
【问题描述】:

我有一个 tibble,其中一列是 list 列,总是有两个数值,分别名为 ab(例如,由于调用 purrr:map 到一个返回 list 的函数),比如:

df <- tibble(x = 1:3, y = list(list(a = 1, b = 2), list(a = 3, b = 4), list(a = 5, b = 6)))
df
# A tibble: 3 × 2
  x          y
 <int>     <list>
1     1 <list [2]>
2     2 <list [2]>
3     3 <list [2]>

如何将列表列y分成ab两列,得到:

df_res <- tibble(x = 1:3, a = c(1,3,5), b = c(2,4,6))
df_res
# A tibble: 3 × 3
  x     a     b
 <int> <dbl> <dbl>
1     1     1     2
2     2     3     4
3     3     5     6

寻找类似tidyr::separate 的东西来处理列表而不是字符串。

【问题讨论】:

    标签: r list tidyverse


    【解决方案1】:

    使用 dplyr(当前版本:0.7.0):

    bind_cols(df[1], bind_rows(df$y))
    # # A tibble: 3 x 3
    #       x     a     b
    #   <int> <dbl> <dbl>
    # 1     1     1     2
    # 2     2     3     4
    # 3     3     5     6
    

    根据 OP 的评论进行编辑:

    要将其嵌入管道中,如果您有许多非列表列,我们可以尝试:

    df %>% select(-y) %>% bind_cols(bind_rows(df$y))
    

    【讨论】:

    • 谢谢。如何将其放入管道中? df %&gt;% select(x) %&gt;% bind_cols(bind_rows(df$y)) 或者你有更优雅的东西吗?
    • @GioraSimchoni 我不擅长使用%&gt;%。我觉得你的代码已经够简单了。
    • @GioraSimchoni,稍微灵活一点:df %&gt;% select(-y) %&gt;% bind_cols(bind_rows(df$y))
    【解决方案2】:

    我们也可以使用purrr中的map_df

    library(tidyverse)
    df %>% 
      summarise(x = list(x), new = list(map_df(.$y, bind_rows))) %>%
      unnest
    # A tibble: 3 x 3
    #      x     a     b
    #   <int> <dbl> <dbl>
    #1     1     1     2
    #2     2     3     4
    #3     3     5     6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 2011-05-26
      • 1970-01-01
      • 2011-08-16
      • 2019-07-03
      相关资源
      最近更新 更多