拆分并计数出现次数

时间:2019-06-18 15:10:51

标签: r

有没有办法像这样拆分字符串?

A1BG\tAAAGGGCGTTCACCGG\t2 A1BG\tAAGATAGCATCCCACT\t1

我想用“ \”分隔,以计算文件中有多少个基因(在这种情况下为A1BG)和有多少个代码(例如AAAGGGCGTTCACCGG和AAGATAGCATCCCACT)。 我在下面的尝试未成功。

strsplit(mydf, '\')[[1]]

有人可以帮我吗?

4 个答案:

答案 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的countn_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)