r - 如何按 tibble 行合并 tibble

标签 r dplyr merge tibble

我有一个tibble,它的每一行都是另一个tibble,见下文:

what_i_have <- tibble::tibble(
    chr = c("chr1", "chr2"),
    s1 = list(
        tibble::tibble(pos = c(1:3), c1_v = c(1:3)),
        tibble::tibble(pos = c(10:15), c2_v = c(10:15))
    ),
    s2 = list(
        tibble::tibble(pos = c(2:4), c1_v = c(1:3)),
        tibble::tibble(pos = c(13:16), c2_v = c(3:6))
    ),
    s3 = list(
        NULL, 
        tibble::tibble(pos = c(12:15), c2_v = c(2:5))
    )
)

看起来像这样

# A tibble: 2 x 4
  chr   s1               s2               s3              
  <chr> <list>           <list>           <list>          
1 chr1  <tibble [3 × 2]> <tibble [3 × 2]> <NULL>          
2 chr2  <tibble [6 × 2]> <tibble [4 × 2]> <tibble [4 × 2]>

我想创建一个列 sT,它按 pos 逐行合并 tibble(chr 除外) >,见下文

what_i_want <- tibble::tibble(
    chr = c("chr1", "chr2"),
    s1 = list(
        tibble::tibble(pos = c(1:3), c1_v = c(1:3)),
        tibble::tibble(pos = c(10:15), c2_v = c(10:15))
    ),
    s2 = list(
        tibble::tibble(pos = c(2:4), c1_v = c(1:3)),
        tibble::tibble(pos = c(13:16), c2_v = c(3:6))
    ),
    s3 = list(
        NULL, 
        tibble::tibble(pos = c(12:15), c2_v = c(2:5))
    ),
    sT  = list(
        tibble::tibble(pos = c(1:3), s1 = c(1:3)) |> 
            dplyr::full_join(tibble::tibble(pos = c(2:4), s2 = c(1:3)), by = "pos") |>
            dplyr::full_join(tibble::tibble(pos = c(NA), s3 = c(NA)), by = "pos"),

        tibble::tibble(pos = c(10:15), s1 = c(10:15)) |> 
            dplyr::full_join(tibble::tibble(pos = c(13:16), s2 = c(3:6)), by = "pos") |> 
            dplyr::full_join(tibble::tibble(pos = c(12:15), s3 = c(2:5)), by = "pos")
    )
)

看起来像这样

# A tibble: 2 x 5
  chr   s1               s2               s3               sT               
  <chr> <list>           <list>           <list>           <list>          
1 chr1  <tibble [3 × 2]> <tibble [3 × 2]> <NULL>           <tibble [4 × 3]>
2 chr2  <tibble [6 × 2]> <tibble [4 × 2]> <tibble [4 × 2]> <tibble [7 × 4]>

特别是,sT tibble 如下所示,请注意,列名称是合并的列名称 (s1, s2s3)不是原始的(c1_vc2_v)

[[1]]
# A tibble: 5 x 4
    pos    s1    s2 s3   
  <int> <int> <int> <lgl>
1     1     1    NA NA   
2     2     2     1 NA   
3     3     3     2 NA   
4     4    NA     3 NA   
5    NA    NA    NA NA   

[[2]]
# A tibble: 7 x 4
    pos    s1    s2    s3
  <int> <int> <int> <int>
1    10    10    NA    NA
2    11    11    NA    NA
3    12    12    NA     2
4    13    13     3     3
5    14    14     4     4
6    15    15     5     5
7    16    NA     6    NA

如何从 what_i_have 获取 what_i_want?谢谢。

最佳答案

您可以转置s列并将reducefull_join结合使用

library(tidyverse)

df$sT <- transpose(df[,-1]) %>% 
  map(~discard(.x, is.null)) %>% 
  map(~imap(.x, ~setNames(.x, c("pos", .y)))) %>% 
  map(~reduce(.x, full_join, by = "pos"))

请注意,结果不会提供您所写的内容。结果中的第一个列表有 4 行而不是 5 行,并且没有 s3 列。原因是 s3 中的 NULL。要获得这些结果,您应该将 s3 中的 NULL 替换为 tibble(pos = NA, c1_v = NA)

关于r - 如何按 tibble 行合并 tibble,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70649775/

相关文章:

python - 使用计数器合并字典

将第 n 列的列值替换为值与条件匹配的数据帧列表

r - 使用 R 替代具有 "dynamic"变量的 for 循环

r - 计算最大直方图值

r - 如何在 dplyr 中使用 recode_factor 来重新编码多个因子值?

r - 如何通过 R 中每行中的可用数据组合进行标记

javascript - 有新键时合并两个对象

r - 将 SPSS 语法文件转换为 R 源代码

删除组中的值与 R 不匹配的数据框行

merge - 如何继续 Mercurial merge