我有一个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
, s2
、s3
)不是原始的(c1_v
、c2_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
列并将reduce
与full_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/