2016-11-26 3 views
2

Gibt es eine Möglichkeit, nach einem Muster in Datenzeilen zu suchen und sie dann in separaten Spalten einer neuen Tabelle zu speichern? Zum Beispiel, wenn ich unter Menge, Scheine und Münzen aus dem Körper extrahieren müssen, denken Sie, ist es möglich, das gewünschte Ergebnis auf RText Mining in R zum Suchen und Extrahieren von Informationen

user_id |  ts |     body     | address |  
3633|  2016-09-29| A wallet with amount = $ 100 has been found with 4 bills and 5 coins| TEST |  
4266|  2016-07-20| A purse having amount = $ 150 has been found with 40 bills and 15 coins| NAME | 
7566|  2016-07-20| A pocket having amount = $ 200 has been found with 4 bills and 5 coins| HELLO | 

(Dies ist das gewünschte Ergebnis)

zu erreichen
user_id | Amount | Bills| Coins| 
3633  | $100 | 4 |  5| 
4266  | $150 | 40 | 15| 
7566  | $200 | 10 | 10| 
+0

Ja, es ist möglich. Sie sollten reguläre Ausdrücke verwenden. Siehe "Regex". Etwas zum [Effekt davon] (http://stackoverflow.com/questions/14159690/regex-grep-strings-containing-us-currency). –

Antwort

0

Hier ist eine Lösung mit stringr und lapply, obwohl es viel mehr geben muss. Erste Teilmenge nur die user.id und body Spalten in etwa wie folgt zu erhalten:

df <- data.frame(user.id = c(3633, 4266, 7566), 
     body = c("A wallet with amount = $ 100 has been found with 4 bills and 5 coins", 
       "A purse having amount = $ 150 has been found with 40 bills and 15 coins", 
       "A pocket having amount = $ 200 has been found with 4 bills and 5 coins")) 

Jetzt haben wir einen regulären Ausdruck für alle Reihen von df gelten werden die Zahlen auf eine Liste, fehlenden oder konvertieren zu einer Matrix Spezifizierungs zu extrahieren Spaltennamen, transponieren und cbind zu user.id aus dem ursprünglichen Datenrahmen.

library(stringr) 
mat <- t(matrix(unlist(lapply(df, str_match_all, "[0-9]+")[2]), nrow = nrow(df))) 
colnames(mat) <- c("Amount", "Bills", "Coins") 
outputdf <- cbind(df[1], mat) 

Das gibt:

> outputdf 
# user.id Amount Bills Coins 
#1 3633 100  4  5 
#2 4266 150 40 15 
#3 7566 200  4  5 

Ich bin sicher, es ist wahrscheinlich eine sauberere Weg, es zu tun.

Verwandte Themen