2017-06-26 4 views
0

Ich versuche, einen einzeiligen Text in R zu teilen und sie in einem Datenrahmen zu speichern.Split String zu Datenrahmen

Zum Beispiel. Ein Text wie folgt aus:

hello-world;1|(good)night world;2|...

Voraussichtlich werden:

V1 V2 
hello-world 1 
(good)night world 2 

Um dies zu erreichen: Ich beginne mit den ursprünglichen Text Aufspalten auf '\'. Aus diesem Grund verwende ich getrennt von tidyr.

library(tidyr) 
as.data.frame(str) %>% separate(str, into=c("V1"), sep='\\|') 
1 hello-world;1 
#Warning message: 
#Too many values at 1 locations: 1 

Ich vermute, in dem ersten Split das Problem mit den - steigt. Wie kann ich dieses Problem lösen?

Antwort

0

Wenn Sie dies über tidyverse tun wollen, dann müssen Sie unnest verwenden, um es lange zu machen und dann separate die Werte, dh

libraary(tidyverse) 

data.frame(v1 = 'hello-world;1|(good)night world;2|') %>% 
     mutate(v1 = strsplit(as.character(v1), '\\|')) %>% 
     unnest(v1) %>% 
     separate(v1, into = c('v1', 'v2'), sep = ';') 

# A tibble: 2 x 2 
#     v1 v2 
#*    <chr> <chr> 
#1  hello-world  1 
#2 (good)night world  2 
1

Wie wäre es damit?

library(tidyverse) 

text <- c("hello-world;1|(good)night world;2") 

df_text <- data.frame(a = unlist(strsplit(text, "|", fixed = T))) 

df_split_text <- separate(df_text, a, c("V1", "V2"), sep = ";") 
0

Wir wissen @ udden2903 die beste Antwort mit tidyverse gegeben hat, aber das base R sollte auch funktionieren. Ersetzen Sie die | durch \n, und lesen Sie dann unter Verwendung

read.table(text=gsub("[|]", "\n", text), header = FALSE, sep=";", stringsAsFactors= FALSE) 
#     V1 V2 
#1  hello-world 1 
#2 (good)night world 2