2
votes

Strsplit et compter les occurrences

Y a-t-il un moyen de diviser une chaîne comme celle-ci?

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

Je voudrais diviser par "\" afin de compter le nombre de gènes dans le fichier où se trouve un gène ce cas A1BG et combien de codes sont où les codes sont par exemple AAAGGGCGTTCACCGG et AAGATAGCATCCCACT. Ma tentative ci-dessous a échoué.

A1BG\tAAAGGGCGTTCACCGG\t2 A1BG\tAAGATAGCATCCCACT\t1

Quelqu'un peut-il m'aider s'il vous plaît?

r

4 commentaires

Vous avez un onglet \ t . Vous aurez peut-être besoin de strsplit (str1, "\ t")


Pouvez-vous montrer la sortie attendue


@akrun Pouvez-vous expliquer pourquoi \ t fonctionne comme split ? J'allais suggérer \\ t , mais j'ai remarqué que les deux fonctionnent.


@yarnabrina C'est un peu surprenant, mais si vous divisez sur "\\ t" R recherchera une contre-oblique littérale, suivie d'un t. Cela existe dans la chaîne, donc il peut être divisé. Si vous divisez sur "\ t" , R cherchera un caractère de tabulation, qui est représenté dans cette chaîne par "\ t" , donc cela fonctionne également.


3 Réponses :


4
votes

Nous pouvons essayer de faire correspondre le modèle d'expression régulière \ b [ACGT] {16} \ b , puis compter le nombre de correspondances dans la chaîne d'entrée:

x <- "A1BG\tAAAGGGCGTTCACCGG\t2 A1BG\tAAGATAGCATCCCACT\t1"
matches <- regmatches(x, gregexpr("\\b[ACGT]{16}\\b", x, perl=TRUE))[[1]]
length(matches)

[1] 2

Si le nombre de paires de bases dans un gène peut ne pas être exactement 16, alors essayez de choisir une longueur de gène qui résulterait dans le compte correct dans ce cas (par exemple entre 10 et 20 paires de bases).

p >


0 commentaires

2
votes

Nous pouvons utiliser str_count

str1 <- "A1BG\tAAAGGGCGTTCACCGG\t2 A1BG\tAAGATAGCATCCCACT\t1"

Si nous divisons, alors divisez à tab ( \ t ) p>

strsplit(str1, "\t")

données

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


0 commentaires

4
votes

Il semble que vous ayez une table TSV (valeurs séparées par des tabulations) mal formée. Si vous remplacez les espaces par des retours à la ligne, vous pouvez le lire sous forme de tableau et vous n'avez pas besoin de configurer vos propres règles d'analyse:

DT[, .N, by=gene]
# or 
DT[, .(N = uniqueN(code)), by=gene]

#    gene N
# 1: A1BG 2

Vous pouvez alors compter le nombre de codes gène comme

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

ou utiliser de manière similaire les fonctions count et n_distinct de dplyr.


0 commentaires