在R中的多列中分隔一列(不同格式)

问题描述 投票:0回答:2

我在 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 包中的“分离”功能。

r dataframe tidyverse multiple-columns
2个回答
1
投票

一个选择是使用

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"
  )
) 

0
投票

试试

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")
© www.soinside.com 2019 - 2024. All rights reserved.