Strsplit и подсчет вхождений - PullRequest
2 голосов
/ 18 июня 2019

Есть ли способ разбить строку, как это?

A1BG\tAAAGGGCGTTCACCGG\t2 A1BG\tAAGATAGCATCCCACT\t1

Я хотел бы разделить на «\», чтобы подсчитать, сколько генов находится в файле, где ген находится в данном случае A1BG, и сколько кодов находится там, где есть коды, например AAAGGGCGTTCACCGG и AAGATAGCATCCCACT. Моя попытка ниже не удалась.

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

Может кто-нибудь помочь мне, пожалуйста?

Ответы [ 4 ]

4 голосов
/ 18 июня 2019

Похоже, у вас неверно сформированная таблица 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.

4 голосов
/ 18 июня 2019

Мы можем попробовать сопоставить с шаблоном регулярных выражений \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 пар оснований).

2 голосов
/ 18 июня 2019

Мы можем использовать str_count

library(stringr)
str_count(str1, "[ACGT]{16}")
#[1] 2

Если мы разбиваем, то разбиваем на вкладке (\t)

strsplit(str1, "\t")

Данные

str1 <- "A1BG\tAAAGGGCGTTCACCGG\t2 A1BG\tAAGATAGCATCCCACT\t1"
0 голосов
/ 18 июня 2019

попробуйте это:

strsplit(mydf, "\", perl = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...