我在 R 中有一个包含 91 列和 51000 行的数据框:第一列是我发现的每个生物的分类学分类('Classification'),其余是每个样本中的丰度('S1','S2' ,'S3',直到'S90')。我想将第一列分成六列:“K”、“P”、“C”、“O”、“F”和“G”列。问题是一些单元格的数据不完整,而且,如果我使用分号分隔单元格,这些单元格将生成比预期更少的列。
当前数据框:
分类 |
---|
k__细菌 |
k__细菌;g__链霉菌 |
k__Bacteria;p__Lentisphaerae |
k__Bacteria;p__Lentisphaerae;c__Oligosphaeri;o__Oligosp;f__Ol |
k__Bacteria;p__Lentisphaerae;c__Oligosphaeri;o__Oligosp;f__Ol;g__Ol |
我的问题是:我可以根据后缀来分离和组织我的单元格吗?我想要一个包含所有以“k__”开头的信息的“K”列,一个包含以“p__”开头的所有信息的列“P”,依此类推。空单元格可以用 NA 填充。
理想数据框:
K | P | C | O | F | G |
---|---|---|---|---|---|
k__细菌 | NA | NA | NA | NA | NA |
k__细菌 | NA | NA | NA | NA | g__链霉菌 |
k__细菌 | p__扁豆科 | NA | NA | NA | NA |
k__细菌 | p__扁豆科 | c__Oligosphaeri | o__Oligosp | f__Ol | NA |
k__细菌 | p__扁豆科 | c__Oligosphaeri | o__Oligosp | f__Ol | g__Ol |
拜托,有人可以帮我吗?
我尝试使用 tidyr 包中的“分离”功能。
一个选择是使用
tidyr::separate_longer_delim
(需要tidyr 1.3.0
)和像这样的pivot_wider
:
library(tidyr)
library(dplyr)
dat |>
mutate(row = row_number()) |>
separate_longer_delim(Classification, delim = ";") |>
mutate(suffix = toupper(substr(Classification, 1, 1))) |>
pivot_wider(names_from = suffix, values_from = Classification) |>
select(-row)
#> # A tibble: 5 × 6
#> K G P C O F
#> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 k__Bacteria <NA> <NA> <NA> <NA> <NA>
#> 2 k__Bacteria g__Streptofusia <NA> <NA> <NA> <NA>
#> 3 k__Bacteria <NA> p__Lentisphaerae <NA> <NA> <NA>
#> 4 k__Bacteria <NA> p__Lentisphaerae c__Oligosphaeri o__Oligosp f__Ol
#> 5 k__Bacteria g__Ol p__Lentisphaerae c__Oligosphaeri o__Oligosp f__Ol
数据
dat <- data.frame(
Classification = c(
"k__Bacteria",
"k__Bacteria;g__Streptofusia", "k__Bacteria;p__Lentisphaerae",
"k__Bacteria;p__Lentisphaerae;c__Oligosphaeri;o__Oligosp;f__Ol",
"k__Bacteria;p__Lentisphaerae;c__Oligosphaeri;o__Oligosp;f__Ol;g__Ol"
)
)
试试
separate_wider_regex
library(tidyr)
separate_wider_regex( col = Classification,
c(K = "k_+\\w+",
";",
P = "k_+\\w+",
";",
C = "c_+\\w+",
";",
O = "O_+\\w+",
";",
F = "F_+\\w+",
";",
G = "G_+\\w+",
),
too_few = "align_start")