首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将tibble合并为tibble行智能

如何将tibble合并为tibble行智能
EN

Stack Overflow用户
提问于 2022-01-10 08:44:50
回答 1查看 159关注 0票数 2

我有一个tibble,它的每一行都是另一个tibble,如下所示:

代码语言:javascript
复制
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))
    )
)

看上去像这样

代码语言:javascript
复制
# 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合并,参见下面

代码语言:javascript
复制
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")
    )
)

看上去像这样

代码语言:javascript
复制
# 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如下所示,请注意,列名是合并的列名(s1s2s3),而不是原始列名(c1_vc2_v)。

代码语言:javascript
复制
[[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_want获得what_i_have?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-01-10 09:56:02

您可以转换s列,并将reducefull_join一起使用。

代码语言:javascript
复制
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 in s3。要获得这些结果,您应该将s3中的s3替换为tibble(pos = NA, c1_v = NA)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70649775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档