2017-06-16 7 views
2

À partir de la chaîne de texte ci-dessous, j'essaie d'extraire un sous-ensemble de chaînes spécifique.Extrait du texte des parenthèses imbriquées les plus à l'intérieur de la chaîne

string <- c("(Intercept)", "scale(AspectCos_30)", "scale(CanCov_500)", 
      "scale(DST50_30)", "scale(Ele_30)", "scale(NDVI_Tin_250)", "scale(Slope_500)", 
      "I(scale(Slope_500)^2)", "scale(SlopeVar_30)", "scale(CanCov_1000)", 
      "scale(NDVI_Tin_1000)", "scale(Slope_1000)", "I(scale(Slope_1000)^2)", 
      "scale(log(SlopeVar_30 + 0.001))", "scale(CanCov_30)", "scale(Slope_30)", 
      "I(scale(Slope_30)^2)") 

Un bon résultat renvoie le texte central sans caractères spéciaux, comme indiqué ci-dessous.

Good <- c("Intercept", "AspectCos", "CanCov", "DST50", "Ele", "NDVI", "Slope", "Slope", 
      "SlopeVar", "CanCov", "NDVI", "Slope", "Slope", "SlopeVar", "CanCov" "Slope", "Slope") 

De préférence cependant, la chaîne résultante expliquerait la ^2 et log liés à la « pente » et « SlopeVar », respectivement. Plus précisément, toutes les chaînes contenant ^2 seraient converties en 'SlopeSq' et toutes les chaînes contenant log seraient converties en 'SlopeVarPs', comme indiqué ci-dessous.

Best <- c("Intercept", "AspectCos", "CanCov", "DST50", "Ele", "NDVI", "Slope", "SlopeSq", 
      "SlopeVar", "CanCov", "NDVI", "Slope", "SlopeSq", "SlopeVarPs", "CanCov" "Slope", "SlopeSq") 

J'ai une séquence de code long, laid et inefficace qui me fait presque à mi-chemin du bon résultat et apprécierait des suggestions.

Répondre

3

En tant que codeur pas si efficace, je voudrais avoir une chaîne de plusieurs regex pour atteindre le résultat (ce que chaque ligne de regex n'est commenté dans chaque ligne):

library(stringr) 
library(dplyr) 
string %>% 
    str_replace_all(".*log\\((.*?)(_.+?)?\\).*", "\\1Ps") %>% # deal with "log" entry 
    str_replace_all(".*\\((.*?\\))", "\\1") %>% # delete anything before the last "(" 
    str_replace_all("(_\\d+)?\\)\\^2", "Sq") %>% # take care of ^2 
    str_replace_all("(_.+)?\\)?", "") -> "outcome" # remove extra characters in the end (e.g. "_00" and ")") 


Best <- c("Intercept", "AspectCos", "CanCov", "DST50", "Ele", "NDVI", "Slope", "SlopeSq", 
      "SlopeVar", "CanCov", "NDVI", "Slope", "SlopeSq", "SlopeVarPs", "CanCov","Slope", "SlopeSq") 
all(outcome == Best) 
## TRUE 
+0

très apprécié. Clair et informatif! aussi ne savais pas que vous pourriez utiliser l'opérateur de tuyauterie avec un limon. Cool. –

+0

La tuyauterie vient en fait de 'dplyr'. J'ai édité ma réponse. –