J'ai de grandes données comme ceci: Ce que je veux faire, c'est que, dans chaque ligne, je souhaite sélectionner le nom après le mot par exemple, la sortie attendue des deux premières lignes serait comme: for(i in 1:nrow(Data)){
Data[i,3] <- sub("mature=([^|]*).*Gene=(.*)", "\\1-\\2", Data[i,1])
Name <- strsplit(as.vector(Data[i,2]),"\\|")[[1]][2]
Data[i,4] <- as.numeric(sub("pvalue=","",Name))
print(i)
}
5 Réponses :
Voici une approche:
Data <- readLines(n = 7)
mature=hsa-miR-5087|mir_Family=-|Gene=OR4F5
mature=hsa-miR-26a-1-3p|mir_Family=mir-26|Gene=OR4F9
mature=hsa-miR-448|mir_Family=mir-448|Gene=OR4F5
mature=hsa-miR-659-3p|mir_Family=-|Gene=OR4F5
mature=hsa-miR-5197-3p|mir_Family=-|Gene=OR4F5
mature=hsa-miR-5093|mir_Family=-|Gene=OR4F5
mature=hsa-miR-650|mir_Family=mir-650|Gene=OR4F5
df <- read.table(sep = "|", text = Data, stringsAsFactors = FALSE)
l <- lapply(df, strsplit, "=")
trim <- function(x) gsub("^\\s*|\\s*$", "", x)
paste(trim(sapply(l[[1]], "[", 2)), trim(sapply(l[[3]], "[", 2)), sep = "-")
# [1] "hsa-miR-5087-OR4F5" "hsa-miR-26a-1-3p-OR4F9" "hsa-miR-448-OR4F5" "hsa-miR-659-3p-OR4F5" "hsa-miR-5197-3p-OR4F5" "hsa-miR-5093-OR4F5"
# [7] "hsa-miR-650-OR4F5"
Peut-être pas le plus élégant, mais vous pouvez essayer: Exemple strong> p> Data<-data.frame(col1=c("mature=hsa-miR-5087|mir_Family=-|Gene=OR4F5","mature=hsa-miR-26a-1-3p|mir_Family=mir-26|Gene=OR4F9"),col2=1:2,stringsAsFactors=F)
> Data[,1]
[1] "mature=hsa-miR-5087|mir_Family=-|Gene=OR4F5" "mature=hsa-miR-26a-1-3p|mir_Family=mir-26|Gene=OR4F9"
> sapply(Data[,1],function(x){
+ parts<-strsplit(x,"\\|")[[1]]
+ y<-paste(gsub("(mature=)|(Gene=)","",parts[grepl("mature|Gene",parts)]),collapse="-")
+ return(y)
+ })
mature=hsa-miR-5087|mir_Family=-|Gene=OR4F5 mature=hsa-miR-26a-1-3p|mir_Family=mir-26|Gene=OR4F9
"hsa-miR-5087-OR4F5" "hsa-miR-26a-1-3p-OR4F9"
Si vous pouvez vous garantir que le format est exactement tel que spécifié, une expression régulière peut capturer (désignée par les supports ci-dessous) de l'égal de la signature du symbole du tuyau et du gène = à la fin et de la pâte ensemble avec un signe moins:
Une autre option consiste à utiliser listable.table code> avec = code> en tant que séparateur puis collant les 2 colonnes: res = read.table(text=txt,sep='=')
paste(sub('[|].*','',res$V2), ## get rid from last part here
sub('^ +| +$','',res$V4),sep='-') ## remove extra spaces
[1] "hsa-miR-5087-OR4F5" "hsa-miR-26a-1-3p-OR4F9" "hsa-miR-448-OR4F5" "hsa-miR-659-3p-OR4F5"
[5] "hsa-miR-5197-3p-OR4F5" "hsa-miR-5093-OR4F5" "hsa-miR-650-OR4F5"
Le simple 1) read.pattern strong> en utilisant donnant: p> La trame de données intermédiaire, Voici une visualisation de l'expression régulière que nous utilisé: p> 1a) noms forts > Nous pourrions faire SUB CODE> La solution déjà donnée semble assez agréable, mais juste au cas où voici d'autres approches: en lecture. Motif Code> dans le package gsubfn Nous pouvons analyser les données dans une donnée. Ce formulaire intermédiaire, df code> peut alors être manipulé à plusieurs égards. Dans ce cas, nous utilisons coller code> de la même manière que dans la question suivante: p> df code>, qui a été produite ressemble à ceci: p>
p> df code> regarder plus bien en lisant les trois colonnes de données et les trois noms séparément. Cela améliore également l'instruction code> Coller CODE>: P> =([^|]*)
Nous n'avons pas
data code> donc lors de la formulation de questions telles que celles-ci, il est préférable d'afficher les données telles que ceci:x <- données [1: 7, 1]; dput (x) code>Votre édition a fait cela un peu d'une cible en mouvement - il n'a pas été initialement clair que vous aviez besoin d'une solution de calcul efficace. Je vous encourage à poster votre propre réponse à cette question qui montre des points de repère pour un ensemble de données raisonnablement volumineux (par exemple, essayez-le sur les 100 000 premières lignes de votre ensemble de données) pour Tous i> des réponses fournies ci-dessous, Suivant le format donné dans les réponses à Cette question .
Vous pouvez également consulter le package Stringi , qui est destiné à Pour le traitement rapide des chaînes, et les
datable.table code> et oudplyr code> paquets