我有一个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]>特别是,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_want获得what_i_have?谢谢。
发布于 2022-01-10 09:56:02
您可以转换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列。原因是NULL in s3。要获得这些结果,您应该将s3中的s3替换为tibble(pos = NA, c1_v = NA)。
https://stackoverflow.com/questions/70649775
复制相似问题