【问题标题】:how to merge tibble in a tibble row wise如何在 tibble 行中合并 tibble
【发布时间】:2022-01-10 08:44:50
【问题描述】:

我有一个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,它将tibble 按行合并(chr 除外)与pos,见下文

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]>

特别是sTtibble看起来像下面这样,注意列名是合并后的列名(s1s2s3)而不是原来的(c1_v、@ 987654337@)

[[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?谢谢。

【问题讨论】:

    标签: r dplyr merge tibble


    【解决方案1】:

    您可以转置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 列。原因是NULL 中的s3。要获得这些结果,您应该将 s3 中的 NULL 替换为 tibble(pos = NA, c1_v = NA)

    【讨论】:

      猜你喜欢
      • 2020-07-09
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 2018-06-13
      • 1970-01-01
      • 2022-01-13
      • 2020-06-06
      相关资源
      最近更新 更多