R语言 如何将一列中的多个分隔字符串拆分到一行中,并删除该行ID中的重复项?

hivapdat  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(186)

下面是我的数据框的外观...

| Fasta标头|
| - ------|
| 表格12第002页;表格12第003页;表格12第005页;表格23第002页; ab23_P001|
| 表格45第001页;表格36第001页|
| 抗体55_第001页;抗体55_第002页|
我设法使用下面的代码将列中的分隔字符串转换为行

library(tidyr)
library(dplyr)
without_02473 %>% 
  mutate(`Fasta headers` = strsplit(as.character(`Fasta headers`), 
      ";")) %>%   unnest(`Fasta headers`)

这导致了
| Fasta标头|
| - ------|
| ab12_P002|
| ab12_P003|
| ab12_P005|
| ab23_P002|
| ab23_P001|
| ab45_P001|
然而,我希望最终能有如下的结果。
| Fasta标头|
| - ------|
| ab12|
| ab23|
| ab45|
| ab36|
我试着使用组和过滤器,unnest(string_string_array),但是我没有成功。有人能帮我吗?

8qgya5xd

8qgya5xd1#

以下是略微不同的方法:

library(stringr)
library(dplyr)
library(tidyr)

without_02473 %>% 
  separate_rows(`Fasta headers`) %>% 
  filter(str_detect(`Fasta headers`, 'ab\\d+')) %>% 
  distinct()
`Fasta headers`
  <chr>          
1 ab12           
2 ab23           
3 ab45           
4 ab36           
5 ab55
xsuvu9jc

xsuvu9jc2#

另一个选项是使用strsplit并删除_之后的所有内容,然后过滤distinct,如下所示:

library(dplyr)
library(tidyr)
without_02473 %>%
  mutate(`Fasta headers` = strsplit(`Fasta headers`, ";")) %>%
  unnest(`Fasta headers`) %>%
  mutate(`Fasta headers` = sub("_[^_]+$", "", `Fasta headers`)) %>%
  distinct()
#> # A tibble: 5 × 1
#>   `Fasta headers`
#>   <chr>          
#> 1 ab12           
#> 2 ab23           
#> 3 ab45           
#> 4 ab36           
#> 5 ab55

创建于2023年1月3日,使用reprex v2.0.2

km0tfn4u

km0tfn4u3#

我们可以使用separate_rows;处拆分Fasta headers以创建新行,然后使用trimws移除从_开始的后缀部分

library(dplyr)
library(tidyr)
out <- without_02473 %>% 
   separate_rows(`Fasta headers`, sep = ";") %>%
   mutate(`Fasta headers` = trimws(`Fasta headers`, whitespace = "_.*")) %>%
   distinct
  • 输出
out
# A tibble: 5 × 1
  `Fasta headers`
  <chr>          
1 ab12           
2 ab23           
3 ab45           
4 ab36           
5 ab55   
library(writexl) 
write_xlsx(out, "first.xlsx")

或者可以仅提取_之前的字,其中str_extract_allunnestlist列,并获得distinct

library(stringr)
without_02473 %>%
   mutate(`Fasta headers` = str_extract_all(`Fasta headers`, 
        "\\w+(?=_)")) %>%
   unnest(`Fasta headers`) %>%
   distinct

数据

without_02473 <- structure(list(`Fasta headers` = c("ab12_P002;ab12_P003;ab12_P005;ab23_P002;ab23_P001", 
"ab45_P001;ab36_P001", "ab55_P001;ab55_P002")), class = "data.frame", row.names = c(NA, 
-3L))

相关问题