2014-09-10 2 views
1

J'ai besoin d'une liste des ID de sujet uniques (la partie avant _ et après /) du contenu d'un dossier ci-dessous.Extraction d'éléments partiels uniques à partir du vecteur

[1] "."      "./4101_0"    "./4101_0/4101 Baseline" 
[4] "./4101_1"    "./4101_2"    "./4101_2_2"    
[7] "./4101_3"    "./4101_4"    "./4101_5"    
[10] "./4101_6"  

En ce moment je le fais (en utilisant les paquets stringr et foreach).

# Create list of contents 
Folder.list <- list.dirs() 
# Split entries by the "/" 
SubIDs <- str_split(Folder.list, "/") 
# For each entry in the list, retrieve the second element 
SubIDs <- unlist(foreach(i=1:length(SubIDs)) %do% SubIDs[[i]][2]) 
# Split entries by the "_" 
SubIDs <- str_split(SubIDs, "_") 
# Take the second element after splitting, unlist it, find the unique entries, remove the NA and coerce to numeric 
SubIDs <- as.numeric(na.omit(unique(unlist(foreach(i=1:length(SubIDs)) %do% SubIDs[[i]][1])))) 

Cela fait le travail mais semble inutilement horrible. Qu'est-ce qui est plus propre pour aller du point A au point B?

Répondre

1

stringr a aussi la fonction str_extract, qui peut être utilisé pour extraire des sous-chaînes qui correspondent à un modèle de regex. Avec un lookbehind positif pour / et un lookahead positif pour _, vous pouvez atteindre votre objectif.

commençant par @ de x Andrie:

str_extract(x, perl('(?<=/)\\d+(?=_)')) 

# [1] NA  "4101" "4101" "4101" "4101" "4101" "4101" "4101" "4101" "4101" 

Le modèle ci-dessus correspond un ou plusieurs chiffres (à savoir \\d+) qui sont précédés d'une barre oblique et suivie d'un trait de soulignement. Envelopper le motif dans perl() est requis pour les balises.

1

Utilise une expression régulière.

x <- c(".", "./4101_0", "./4101_0/4101 Baseline", "./4101_1", "./4101_2", "./4101_2_2", "./4101_3", "./4101_4", "./4101_5", "./4101_6") 

Une façon d'utiliser une expression régulière est d'utiliser gsub() pour extraire le code objet

gsub(".*/(\\d+)_.*", "\\1", x) 
[1] "." "4101" "4101" "4101" "4101" "4101" "4101" "4101" "4101" "4101" 
+1

@Krysta: notez cependant que si le motif n'est pas trouvé pour un élément particulier, la chaîne d'origine de cet élément est retournée non modifiée (comme pour '.'). – jbaums

Questions connexes