2017-03-10 3 views
1

Ich habe eine schwerwiegende Zeichenfolge, die Zahlen enthält. Einige dieser Zeichenfolge enthalten 2 Zahlen wie folgt aus:Extrahieren Sie den Mindestwert aus einer Zeichenfolge, wenn mehr als 1 Zahlen in dieser Zeichenfolge sind

library(tidyverse) 
df1 <- data.frame(x ="Want to extract both values 7 + 8", 
        y = "var") 

Ich interessiere mich für die kleinste Zahl aus dieser Zeichenfolge aber habe Probleme beim Extrahieren, weil ich in einer Liste-Spalte immer enden und nicht wirklich wissen, wie man Vorgehen. Mein idealer Ausgang wäre so etwas wie:

> df1 
            x y comp_num firstnum secondnum 
1 Want to extract both values 7 + 8 var  7, 8   7   8 

Hier ist, wie ich die Nummer am extrahieren:

df1$comp_num = regmatches(df1$x,gregexpr('[0-9]+',df1$x)) 

Aber dann habe mich mit einer Liste Spalte landen. Hier ist, was ich bisher versucht:

df1$unnestval <- tidyr::unnest(df1$comp_num) 

df1$separ <- tidyr::separate(df1$comp_num) 

df1$unlistval <- unlist(df1$comp_num) 

Das Problem, das ich habe, ist, mit der Liste Spalte aber nur, weil das ist, wo mein Ansatz endete. Die zentrale Frage ist, wie man den Minimalwert aus einer Zeichenkette extrahiert, wenn mehr als 1 Zahlen in dieser Zeichenkette enthalten UND diese Zahlen als Spalte im Datenrahmen ausgeben.

+1

'df1 $ comp_num = min (unlist (regmatches (df1 $ x, gregexpr ('[0-9] +', df1 $ x))) ' – HubertL

+0

Fwiw, deine Verwendung von unnest ist falsch. Es benötigt zwei Argumente: sowohl den Datensatz als auch die Spalte, etwa wie 'tidyr :: unnest (df1, comp_num)' – Frank

Antwort

1

Dies kann hilfreich sein, wenn Sie zu data.table wechseln möchten.

library(data.table) 
DT <- data.table(C1=replicate(5, paste0(sample(LETTERS, 2), sample(1:9,2), collapse = ""))) 
DT 
    C1 
1: Y7J6 
2: J8O5 
3: M4G6 
4: I5Q9 
5: T3M1 

## Extracting Digits 
DT[ , C2:=lapply(C1, function(x){ gsub("[^\\d]", "", x, perl = T) }), by=C1] 

## Extracting Min Value 
DT[, C3:=lapply(C2, function(x){min(as.integer(unlist(strsplit(x, ""))))}), by=C1] 

## Extracting Max Value 
DT[, C4:=lapply(C2, function(x){max(as.integer(unlist(strsplit(x, ""))))}), by=C1] 
DT 
    C1 C2 C3 C4 
1: Y7J6 76 6 7 
2: J8O5 85 5 8 
3: M4G6 46 4 6 
4: I5Q9 59 5 9 
5: T3M1 31 1 3 

Beachten Sie, dass der reguläre Ausdruck [^\\d] wird in einem String alle nicht-Ziffern entsprechen.

Verwandte Themen