有没有办法像这样拆分字符串?
A1BG\tAAAGGGCGTTCACCGG\t2 A1BG\tAAGATAGCATCCCACT\t1
我想用“ \”分隔,以计算文件中有多少个基因(在这种情况下为A1BG)和有多少个代码(例如AAAGGGCGTTCACCGG和AAGATAGCATCCCACT)。 我在下面的尝试未成功。
strsplit(mydf, '\')[[1]]
有人可以帮我吗?
答案 0 :(得分:4)
我们可以尝试在正则表达式模式\b[ACGT]{16}\b
上进行匹配,然后计算输入字符串中的匹配数:
x <- "A1BG\tAAAGGGCGTTCACCGG\t2 A1BG\tAAGATAGCATCCCACT\t1"
matches <- regmatches(x, gregexpr("\\b[ACGT]{16}\\b", x, perl=TRUE))[[1]]
length(matches)
[1] 2
如果一个基因中碱基对的数目可能不完全是16个,那么请尝试选择一个基因长度,在这种情况下,该长度将导致正确的计数(例如10到20个碱基对之间)。
答案 1 :(得分:4)
您似乎有一个格式不正确的TSV(制表符分隔的值)表。如果将空格换成换行符,则可以将其作为表读取,而无需设置自己的解析规则:
x <- "A1BG\tAAAGGGCGTTCACCGG\t2 A1BG\tAAGATAGCATCCCACT\t1"
x2 <- gsub(" ", "\n", x)
library(data.table)
DT = setnames(fread(x2), c("gene", "code", "num"))[]
# gene code num
# 1: A1BG AAAGGGCGTTCACCGG 2
# 2: A1BG AAGATAGCATCCCACT 1
然后您可以计算每个基因有多少个密码
DT[, .N, by=gene]
# or
DT[, .(N = uniqueN(code)), by=gene]
# gene N
# 1: A1BG 2
或类似地使用dplyr的count
和n_distinct
函数。
答案 2 :(得分:2)
我们可以使用str_count
library(stringr)
str_count(str1, "[ACGT]{16}")
#[1] 2
如果要拆分,请在标签(\t
)上拆分
strsplit(str1, "\t")
str1 <- "A1BG\tAAAGGGCGTTCACCGG\t2 A1BG\tAAGATAGCATCCCACT\t1"
答案 3 :(得分:-1)
尝试:
strsplit(mydf, "\", perl = TRUE)