2017-10-23 1 views
0

Ich habe eine Datentabelle mit zwei Spalten, wobei die erste Spalte eine Id-Variable und die zweite Spalte eine Zeichenfolge enthält. Die Zeichenfolge in der zweiten Spalte hat das FormatDatenreinigung mit Stringr

"A:randomString|B:randomString|C:randomString".

Ich möchte die Tabelle ändern, um 4 Spalten zu haben: Id, A, B und C. Id bleiben die gleichen, A würde die zufällige Zeichenfolge nach jedem A haben :, B würde die Zeichenfolge folgende B haben: , und C würde die Zeichenfolge nach C: haben.

Ist dies mit stringr möglich?

+2

Versuchen 'Bibliothek (tidyr) df1%>% mutieren (col2 = gsub (":", "", col2))%>% trennen (col2, in = c ('A', 'B', 'C')) ' – akrun

+0

hat sehr geholfen! Das Problem, das ich jetzt habe, ist, dass für "C: randomString" die zufällige Zeichenkette einen Unterstrich enthält (es ist also eher wie "C: random_String"). Dies bewirkt, dass diese Zeichenkette in verschiedene Spalten aufgeteilt wird. – newToCoding13

Antwort

0

Sie können diese mit stringr::str_extract() tun und regulären Ausdrücken lookbehind and lookahead Verwendung:

library(tidyverse) 

df <- readr::read_csv("~/../Downloads/test1.csv") 

df <- df %>% 
    mutate(A = str_extract(col2, "(?<=A:).*?(?=\\|)"), 
     B = str_extract(col2, "(?<=B:).*?(?=\\|)"), 
     C = str_extract(col2, "(?<=C:).*?$") 
) 

Beispiel

Die Beispieldaten df ist:

> df 
# A tibble: 2 x 2 
    Id         col2 
    <int>         <chr> 
1  1 A:frog's legs|B:popcorn|C:white_wine! 
2  2  A:banana SUNDAE|B:[email protected]$%^|C:123456 

Verwenden dplyr::mutate() die neuen Spalten A zu erstellen, B und C:

> df <- df %>% 
+ mutate(A = str_extract(col2, "(?<=A\\:).*?(?=\\|)"), 
+   B = str_extract(col2, "(?<=B\\:).*?(?=\\|)"), 
+   C = str_extract(col2, "(?<=C\\:).*?$") 
+ ) 

Die data.frame df nach dieser Operation ist:

> df 
# A tibble: 2 x 5 
    Id         col2    A  B   C 
    <int>         <chr>   <chr> <chr>  <chr> 
1  1 A:frog's legs|B:popcorn|C:white_wine! frog's legs popcorn white_wine! 
2  2  A:banana SUNDAE|B:[email protected]$%^|C:123456 banana SUNDAE [email protected]#$%^  123456 

Wie die regulären Ausdrücke arbeiten

Der reguläre Ausdruck verwendet für Lookbehind A: (in der ersten Saite) und Look-Ahead für | anzupassen alle Zeichen zwischen diesen beiden. Dito für die zweite Zeichenfolge B:. Für die dritte Zeichenfolge werden alle Zeichen nach C: bis zum Ende der Zeichenfolge abgeglichen.

Caveat

Die oben übernimmt die Trennzeichen | wird nicht in der zufälligen Zeichenfolgen sein. Ist dies nicht der Fall ist, dann müssen die regulären Ausdrücke leicht um dies zu berücksichtigen eingestellt werden:

> df 
# A tibble: 2 x 2 
    Id         col2 
    <int>         <chr> 
1  1 A:frog's l|egs|B:popcorn|C:white_wine! 
2  2  A:banana SUNDAE|B:[email protected]|$%^|C:123456 

Notiere die | Zeichen innerhalb der zufälligen Zeichenfolgen oben. Wir wechseln die Look-Ahead-Teile der regulären Ausdrücken Konto für diese:

> df <- df %>% 
+ mutate(A = str_extract(col2, "(?<=A:).*?(?=\\|B:)"), 
+   B = str_extract(col2, "(?<=B:).*?(?=\\|C:)"), 
+   C = str_extract(col2, "(?<=C:).*?$") 
+ ) 
> df 
# A tibble: 2 x 5 
    Id         col2    A  B   C 
    <int>         <chr>   <chr> <chr>  <chr> 
1  1 A:frog's l|egs|B:popcorn|C:white_wine! frog's l|egs popcorn white_wine! 
2  2  A:banana SUNDAE|B:[email protected]|$%^|C:123456 banana SUNDAE [email protected]|$%^  123456 
0

Sie können dieses verwenden:

library(stringr) 
xt <- "A:randomString|B:randomString|C:randomString" 
colnm <- unlist(str_extract_all(xt, "[A-Z](?=:)")) 
values <- setNames(data.frame(rbind(unlist(str_extract_all(xt,"(?![A-Z]:)\\w+")))), colnm) 

Ausgang:

print(values) 
      A   B   C 
1 randomString randomString randomString 
Verwandte Themen