【发布时间】: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看起来像下面这样,注意列名是合并后的列名(s1、s2、s3)而不是原来的(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?谢谢。
【问题讨论】: