2016-11-22 1 views
2

J'utilise r, et je cherche à utiliser des expressions régulières pour calculer les sommes de lignes pour la quantité d'occurrences d'un modèle de chaîne qui se produit toutes les colonnes d'une trame de données contenant des informations épigénétiques. Il y a 40 colonnes, dont 15 peuvent ou non contenir le motif d'intérêt. Le code qui m'a obtenu le plus proche de ce que je suis à la recherche est:R exige des sommes de lignes pour les occurrences de motif regex qui peuvent apparaître plusieurs fois dans des cellules individuelles

# Looking to match following exact pattern ',.,' which will always be 
# preceded and followed by a sequence of characters or numbers. 
# Note: the full stop in the pattern above signifies any character 

df$rowsum <- rowSums(apply(df, 2, grep, pattern = ".*,.,.*")) 

Pour chaque ligne, cela donne un décompte des colonnes qui contiennent le motif, mais la question que j'ai est que toute cellule individuelle peut contient ce motif plus d'une fois. J'ai essayé plusieurs combinaisons de fonctions différentes pour essayer d'obtenir la réponse, et je me rends compte que grep n'est probablement pas la solution car elle crache une logique chaque fois qu'elle trouve le motif, ce qui signifie qu'elle ne peut rapporter qu'un maximum de correspondance cellule particulière. J'ai besoin d'une solution qui compte chaque occurrence du modèle dans chaque cellule individuelle dans une seule ligne, et ajoute ces valeurs pour fournir un total de ligne. Ce total est ajouté colonne rowsum de cette ligne particulière.

Pour le contexte d'une occurrence individuelle typique du contenu d'une cellule particulière pourrait être:

2212(AATTGCCCCACA,-,0.00) 

Alors que s'il y avait plusieurs occurrences ils existent dans la cellule comme une chaîne continue chaque entrée séparée par une virgule, par exemple pour deux entrées: comme tout le reste pour chaque entrée est variable

144(TGTGAGTCAC,+,0.00),145(GTGAGTCACT,-,0.00) 

J'utilise le ,., comme l'identifiant unique de chaque entrée,.

Voici quelques données de jouets:

df <-data.frame(NAMES = c('A', 'B', 'C', 'D'), 
      GENE1 = c("144(TGTGAGTCAC,+,0.00),145(GTGAGTCACT,-,0.00)", "2(TGTGAGTCAC,+,0.00)", "NA", "NA"), 
      GENE2 = c("632(TAAAGAGTCAC,-,0.00),60(GTCCCTCACT,-,0.00),", "7(TGTGAGTCAC,+,0.00)", "7(TGTGAGTCAC,+,0.00)", "NA"), 
      stringsAsFactors = F) 

Le code optimal fournirait une trame de données avec une somme de ligne colonne associée aux totaux:

# Omitted GENE column contents to save space 

NAMES GENE1  GENE2  rowsum 
    A  ...  ...   4 
    B  ...  ...   2 
    C  ...  ...   1 
    D  ...  ...   0 

Been perplexes sur ce pendant 48 heures. Toute aide serait grandement appréciée.

Répondre

0

Nous pouvons utiliser str_extract de stringr

library(stringr) 
df$rowsum <- Reduce(`+`, lapply(df[-1], 
     function(x) lengths(str_extract_all(x, "\\d+\\(")))) 
df$rowsum 
#[1] 4 2 1 0 
+0

Salut @akrun, pas une avance utilisateur R afin de trouver qu'il est difficile d'interpréter votre réponse. Votre code fonctionne pour les données de jouets mais pas pour l'ensemble de mes données, il semble surestimer les sommes des lignes. – Darren

+0

@Darren J'utilise la regex pour faire correspondre les nombres avant le '('.) Donc, dans l'exemple, la première rangée a 4 instances, secondes, 2, et ainsi de suite – akrun

+0

Messed autour de cela pendant un certain temps, tourné La surestimation a été causée par les NA assignées par R lorsque j'ai importé le fichier Les NA que j'ai envoyées dans les données du jouet ont été envoyées comme des chaînes, donc elles n'ont pas causé le même problème. les sommes des lignes ont disparu en me donnant les réponses attendues.Toute idée pourquoi cela est arrivé? Merci pour votre aide, très appréciée !! – Darren