2016-07-19 8 views
0

Mein df sieht wie folgt aus:Split eine Spalte in zwei in r

Time 
Week End 07-01-10 
Week End 07-02-10 

ich will es als

Column  Time 
Week End 07-01-10 
Week End 07-02-10 

I-Paket gegoogelt stringr nützlich sein würde, aber ich bin nicht in der Lage, es zu benutzen richtig da Es gibt zwei Räume.

+0

Ihr eingefügtes df sieht aus wie es nur ein Leerzeichen hat. Welchen Code hast du ausprobiert? – Nate

+0

Es gibt zwei Leerzeichen; eine nach ** Woche ** und die andere nach ** Ende **. Ich habe keinen Code ab sofort –

Antwort

2

Sie können extract von tidyr Paket verwenden, wo Sie reguläre Ausdrücke angeben können, um die Spalte zu spalten:

library(tidyr) 
extract(df, Time, into = c("Column", "Time"), "(.*)\\s(\\S+)") 
#  Column  Time 
# 1 Week End 07-01-10 
# 2 Week End 07-02-10 

Verwenden (.*)\\s(\\S+) zwei Gruppen und Split auf den Raum zu erfassen, die von einer Gruppe anschließt, die keine Leerzeichen enthält \\S+.

Wenn Sie stringr Paket verwenden möchten, können Sie str_match Funktion mit ähnlicher Funktionalität verwenden:

stringr::str_match(df$Time, "(.*)\\s(\\S+)")[, 2:3] 
#  [,1]  [,2]  
# [1,] "Week End" "07-01-10" 
# [2,] "Week End" "07-02-10" 

strsplit funktioniert auch, wenn Sie den Raum angeben, die eine vor der Stelle zu sein, hier ?= steht für Vorgriffs \\d und ist eine Abkürzung für Ziffern und entspricht [0-9]:

do.call(rbind, strsplit(df$Time, "\\s(?=\\d)", perl = T)) 
#  [,1]  [,2]  
# [1,] "Week End" "07-01-10" 
# [2,] "Week End" "07-02-10" 
+0

Vielen Dank Psidom, aber was muss ich tun, wenn es mehr Spalten im Datenrahmen gibt und ich einen Datenrahmen mit nur einer Änderung zu dieser Spalte erstellen möchte? –

+0

Verwenden Sie die erste Version 'extract' aus dem tidyr-Paket, sie sollte andere Spalten unberührt lassen. – Psidom

+0

Es wirft den folgenden Fehler ** Fehler: konnte Funktion "Auszug" nicht finden ** –

0

Hier ist eine Basis-R-Lösung.

df <- data.frame(c("Week End 07-01-10", "Week End 07-02-10"), 
       stringsAsFactors=FALSE) 
names(df) <- "Time" 

# Assuming all columns end with (time?) in the same format. 
df$Column <- substring(df$Time, 0, nchar(df$Time)-9) 
df$Time <- substring(df$Time, nchar(df$Time)-8, nchar(df$Time)) 
df <- df[, c(2,1)]; df # Changing column order 
1

Wir read.table von base R verwenden. Keine Pakete benötigt

read.table(text=sub("\\s+(\\S+)$", ",\\1", df1$Time), header=FALSE, 
    col.names = c("Column", "Time"), stringsAsFactors=FALSE, sep=",") 
# Column  Time 
#1 Week End 07-01-10 
#2 Week End 07-02-10