J'ai la colonne suivante «vérifie» dans mon bloc de données «B» qui a des états d'entrée dans différentes lignes. Ces instructions ont une variable 'abc', et leur correspondant est également une entrée de valeur. Les saisies effectuées sont manuelles et ne sont pas cohérentes pour chaque saisie. Je dois extraire juste 'abc' et suivi de sa 'valeur'

< B$checks

    rows    Checks
    [1] there was no problem  reported measures abc-96 xyz 450 327bbb11869 xyz 113 aaa 4 poc 470 b 3 surveyor issue
    [2] abc(107 to 109) xyz 115 jbo xyz 104 optim
    [3] problemm with caller abc 95 19468 4g xyz 103 91960 1 Remarks new loc reqd is problem
    [4] abc_107 xyz 116 dor problem 
    [5] surevy done , no approximation issues abc 103 xyz 109 crux xyz 104 
    [6] ping test ok abc(86 rxlevel 84
    [7] field is clean , can be used to buiild the required set up abc-86 xyz 94 Digital DSL  No Building class Residential Building Type Multi
    [8] abc 89 xyz 99 so as the user has no problem , check ping test

Production attendue

rows    Variable    Value
        [1] abc 96
        [2] abc 107
        [3] abc 95
        [4] abc 107
        [5] abc 103
        [6] abc 86
        [7] abc 86
        [8] abc 89

J'ai essayé ce qui suit en utilisant des références sous des requêtes similaires

En utilisant str_match

library(stringr)
m1 <- str_match(B$checks, "abc.*?([0-200.]{1,})")  # value is between 0 to 200

Qui a donné quelque chose comme ci-dessous

    row var value
1   abc-96 xyz 450  0
2   abc(10  10
3   abc 95 1    1
4   abc_10  10
5   abc 10  10
6   NA  NA
7   NA  NA
8   NA  NA

Ensuite, j'ai essayé ce qui suit

B$Checks <- gsub("-", " ", B$Checks)
B$Checks <- gsub("/", " ", B$Checks)
B$Checks <- gsub("_", " ", B$Checks)
B$Checks <- gsub(":", " ", B$Checks)
B$Checks <- gsub(")", " ", B$Checks)
B$Checks <- gsub("((((", " ", B$Checks)
B$Checks <- gsub(".*abc", "abc", B$Checks) 
B$Checks <- gsub("[[:punct:]]", " ", B$Checks)
regexp <- "[[:digit:]]+"   
m <- str_extract(B$Checks, regexp) 
m <- as.data.frame(m)

Et a pu obtenir le "résultat attendu",

Mais maintenant je cherche à suivre

1) Ensemble de commandes plus simple ou moyen d'extraire la sortie attendue

2) Obtenez des valeurs qui sont représentées sous forme de plage, par exemple Je veux la ligne d'entrée ci-dessous

rows    Checks
[2] abc(107 to 109) xyz 115 jbo xyz 104 optim

Comme

Sortie>

rows    Variable    Value1 Value2
 [2]     abc        107   109

Besoin de la solution pour 1) et 2) car je travaille sur des ensembles de données plus volumineux avec les mêmes modèles et beaucoup de combinaisons mixtes de valeurs variables.

Merci d'avance.

1
smokinjoe 23 mai 2018 à 14:34

3 réponses

Meilleure réponse

Vous devez capturer les chiffres, en spécifiant que vous voulez abc avant les chiffres avec lookbehind:

Value <- sub(".*(?<=abc)(\\D+)?(\\d*)\\D?.*", "\\2", str, perl=TRUE)
# Value
#[1] "96"  "107" "95"  "107" "103" "86"  "86"  "89"

Vous pouvez ensuite mettre les valeurs dans un data.frame:

B <- data.frame(Variable="abc", Value=as.numeric(Value))
head(B, 3)
#  Variable Value
#1      abc    96
#2      abc   107
#3      abc    95

données

str <- c("there was no problem  reported measures abc-96 xyz 450 327bbb11869 xyz 113 aaa 4 poc 470 b 3 surveyor issue", 
"abc(107 to 109) xyz 115 jio xyz 104 optim", "problemm with caller abc 95 19468 4g xyz 103 91960 1 Remarks new loc reqd is problem", 
"abc_107 xyz 116 dor problem", "surevy done , no approximation issues abc 103 xyz 109 crux xyz 104 ", 
"ping test ok abc(86 rxlevel 84", "field is clean , can be used to buiild the required set up abc-86 xyz 94 Digital DSL  No Building class Residential Building Type Multi", 
"abc 89 xyz 99 so as the user has no problem , check ping test")
3
Cath 23 mai 2018 à 12:02

Utilisation de stringr pour manipuler des chaînes et rebus pour écrire une expression régulière lisible:

library(stringr)
library(rebus)
str_match(checks, pattern = capture("abc") %R% optional(or1(c(SPC, PUNCT))) %R% capture(one_or_more(DGT)))

sortie:

     [,1]      [,2]  [,3] 
[1,] "abc-96"  "abc" "96" 
[2,] "abc(107" "abc" "107"
[3,] "abc 95"  "abc" "95" 
[4,] "abc_107" "abc" "107"
[5,] "abc 103" "abc" "103"
[6,] "abc(86"  "abc" "86" 
[7,] "abc-86"  "abc" "86" 
[8,] "abc 89"  "abc" "89"

données:

checks <- c("there was no problem  reported measures abc-96 xyz 450 327bbb11869 xyz 113 aaa 4 poc 470 b 3 surveyor issue", 
            "abc(107 to 109) xyz 115 jio xyz 104 optim", "problemm with caller abc 95 19468 4g xyz 103 91960 1 Remarks new loc reqd is problem", 
            "abc_107 xyz 116 dor problem", "surevy done , no approximation issues abc 103 xyz 109 crux xyz 104 ", 
            "ping test ok abc(86 rxlevel 84", "field is clean , can be used to buiild the required set up abc-86 xyz 94 Digital DSL  No Building class Residential Building Type Multi", 
            "abc 89 xyz 99 so as the user has no problem , check ping test")
0
HNSKD 24 mai 2018 à 03:29

Utiliser gsub () deux fois et magrittr pour une meilleure lisibilité:

library(magrittr)

data.frame(
  Variable = "abc",
  Value = data %>%
    gsub(".*(abc.{6}).*", "\\1", .) %>%
    gsub("[^0-9]+(\\d+).*", "\\1", .)
)
  Variable Value
1      abc    96
2      abc   107
3      abc    95
4      abc   107
5      abc   103
6      abc    86
7      abc    86
8      abc    89

Nous obtenons d'abord l'extrait abc et les 6 caractères suivants, puis extrayons le premier entier à apparaître.

données :

data <- c("there was no problem  reported measures abc-96 xyz 450 327bbb11869 xyz 113 aaa 4 poc 470 b 3 surveyor issue", 
"abc(107 to 109) xyz 115 jio xyz 104 optim", "problemm with caller abc 95 19468 4g xyz 103 91960 1 Remarks new loc reqd is problem", 
"abc_107 xyz 116 dor problem ", "surevy done , no approximation issues abc 103 xyz 109 crux xyz 104 ", 
"ping test ok abc(86 rxlevel 84", "field is clean , can be used to buiild the required set up abc-86 xyz 94 Digital DSL  No Building class Residential Building Type Multi", 
"abc 89 xyz 99 so as the user has no problem , check ping test"
)
0
sindri_baldur 23 mai 2018 à 12:33