【问题标题】:Join tibbles in list to one tibble [duplicate]将列表中的小标题加入一个小标题[重复]
【发布时间】:2019-05-15 20:06:51
【问题描述】:

我有一个包含两个数据框的列表

a = list(
        mtcars %>% as_tibble() %>% select(-vs), 
        mtcars %>% as_tibble() %>% sample_n(17)
    ) 

并向数据集添加一个新列

b = a %>% 
    map(~ mutate(.x, class = floor(runif(nrow(.x), 0, 2)))) %>%
    map(~ nest(.x, -class))

现在我想基于class 将两个列表元素连接到一个 tibble。具体来说,我正在寻找比inner_join(pluck(b, 1), pluck(b, 2), "class") 更“平滑”的解决方案,它可以提供所需的结果,但如果a 列表中涉及更多数据集,很快就会变得混乱。

【问题讨论】:

  • 如何加入他们?像行绑定?还是左连接或内连接?
  • 像内部连接
  • 您可以使用left_joininner_join 将其通过管道传输到reduce,并通过class 加入。类似于stackoverflow.com/q/48452421/5325862
  • 啊,也许我应该说清楚。我使用上面的代码得到了一个包含两个小标题的列表。小标题的类别为第一列,小标题为第二列。我想合并列表中的小标题保持小标题中的小标题不受影响(也就是说,我不想合并小标题中的小标题,而只合并列表中的小标题)跨度>
  • 你能发布一个示例输出吗?

标签: r dplyr tidyverse tidyr purrr


【解决方案1】:

这个问题不是很清楚,但似乎有足够的用例可以解决。我在a 中添加了几个数据框,构造类似,因为您使用的样本太小,无法真正看到您需要处理的内容。

library(tidyverse)

set.seed(123)
a <- list(
  mtcars %>% as_tibble() %>% select(-vs), 
  mtcars %>% as_tibble() %>% sample_n(17),
  mtcars %>% as_tibble() %>% slice(1:10),
  mtcars %>% as_tibble() %>% select(mpg, cyl, disp)
) 
# same construction of b as in the question

您可以使用purrr::reduce 重复执行inner_join 调用,返回嵌套数据帧的单个数据帧。这很简单,但我想不出一个为连接提供suffix 参数的好方法,它默认分配.x.y 以区分重复的列名。所以你会得到这些奇怪的名字:

b %>%
  reduce(inner_join, by = "class")
#> # A tibble: 2 x 5
#>   class data.x            data.y           data.x.x         data.y.y       
#>   <dbl> <list>            <list>           <list>           <list>         
#> 1     1 <tibble [11 × 10… <tibble [8 × 11… <tibble [3 × 11… <tibble [17 × …
#> 2     0 <tibble [21 × 10… <tibble [9 × 11… <tibble [7 × 11… <tibble [15 × …

您可能可以通过在reduce 之前创建类似data1data2 等的名称来处理这些名称,但我决定的最快的事情是用每个数据帧的索引替换后缀列出b。更复杂的命名方案将是针对不同问题的任务。

b %>%
  reduce(inner_join, by = "class") %>%
  rename_at(vars(starts_with("data")), 
            str_replace, "(\\.\\w)+$", as.character(1:length(b))) %>%
  names()
#> [1] "class" "data1" "data2" "data3" "data4"

【讨论】:

    猜你喜欢
    • 2023-01-28
    • 2019-11-14
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2021-12-13
    • 2021-06-22
    • 2013-09-20
    • 2020-02-11
    相关资源
    最近更新 更多