数据集含非分隔符冒号致tidyverse分隔报错,求解决方案
处理含非分隔符冒号的字符串拆分报错问题
问题背景
原本使用冒号作为分隔符拆分GO注释数据,但数据集中存在非分隔用途的冒号(例如UTP:process2),运行以下tidyverse代码时触发报错:
library(tidyverse) df <- tribble( ~Name, ~Value, ~GOs, "Ab1", "1000", "F: f1; F: f2; P: p1", "Bb1", "2000", "P: p1; F: f1; F: UTP:process2", # 含额外冒号的测试条目 "Cb1", "3000", "C: c1; F: f1" ) df |> separate_longer_delim(GOs, delim = ";") |> separate_wider_delim(GOs, delim = ":", names_sep = ":") |> mutate(across(everything(), str_squish)) |> pivot_wider(names_from = `GOs:1`, values_from = `GOs:2`) |> unnest(c("F", "P", "C"))
报错信息:
Error in
separate_wider_delim():
! Expected 3 pieces in each element ofGOs.
! 9 values were too short.
由于数据集规模极大,无法逐个定位异常条目,需要调整代码适配这类情况。
解决方案
方法1:利用separate_wider_delim的too_few参数
separate_wider_delim提供了too_few参数,可指定拆分片段数不足时的处理逻辑。我们只需要拆分第一个冒号,因此设置too_few = "align_start",让后续的冒号保留在第二个字段中:
df |> separate_longer_delim(GOs, delim = ";") |> separate_wider_delim( GOs, delim = ":", names = c("GO_type", "GO_term"), too_few = "align_start" # 不足时从开头对齐,剩余内容归入最后一个字段 ) |> mutate(across(c(GO_type, GO_term), str_squish)) |> pivot_wider(names_from = GO_type, values_from = GO_term) |> unnest(c(F, P, C), keep_empty = TRUE)
方法2:使用正则表达式拆分第一个冒号
如果更习惯用正则,可通过separate_wider_regex匹配第一个冒号,把后续所有内容(包括额外冒号)归入第二个字段:
df |> separate_longer_delim(GOs, delim = ";") |> separate_wider_regex( GOs, patterns = c(GO_type = "^[^:]+", ": ", GO_term = ".*") ) |> pivot_wider(names_from = GO_type, values_from = GO_term) |> unnest(c(F, P, C), keep_empty = TRUE)
两种方法都能正确处理带额外冒号的条目,比如F: UTP:process2会被拆分为GO_type = "F",GO_term = "UTP:process2",不会因额外冒号导致拆分错误。
内容的提问来源于stack exchange,提问作者Isidro Sobrino
相关产品推荐
相关产品推荐

