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?
3 Réponses :
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 >
Nous pouvons utiliser str_count
str1 <- "A1BG\tAAAGGGCGTTCACCGG\t2 A1BG\tAAGATAGCATCCCACT\t1"
Si nous divisons, alors divisez à tab ( \ t ) p>
strsplit(str1, "\t")
library(stringr)
str_count(str1, "[ACGT]{16}")
#[1] 2
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.
Vous avez un onglet
\ t. Vous aurez peut-être besoin destrsplit (str1, "\ t")Pouvez-vous montrer la sortie attendue
@akrun Pouvez-vous expliquer pourquoi
\ tfonctionne commesplit? 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.