2016-07-19 2 views
0

Моя ДФ выглядит следующим образом:Split колонки в двух в г

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

Я хочу, чтобы это как

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

Я гугле пакет stringr будет полезным, но я не могу использовать его правильно, так как есть два пробела.

+0

Ваш вставленный df выглядит так, как будто он имеет только одно пространство. Какой код вы пробовали? – Nate

+0

Есть два пробела; один после ** Неделя ** и другой после ** Конец **. Я не пробовал код на данный момент –

ответ

2

Вы можете использовать extract из tidyr пакета, в котором можно указать регулярные выражения, чтобы разделить колонки:

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 

Используйте (.*)\\s(\\S+), чтобы захватить две группы и раскол в пространстве, за которым следует группа, которая не содержит никакого пространства \\S+.

Если вы хотите использовать stringr пакет, вы можете использовать str_match функции с аналогичной функциональностью:

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

strsplit также работает, если указать место быть один перед цифрой, здесь ?= стендов для прогностического и \\d это аббревиатура для цифр и эквивалентно [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

Большое спасибо Psidom, но что мне нужно сделать, если в кадре данных больше столбцов, и я хочу создать dataframe с простое изменение этого столбца? –

+0

Используйте первую версию 'extract' из пакета tidyr, он должен оставить нетронутыми другие столбцы. – Psidom

+0

Он выдает следующую ошибку ** Ошибка: не удалось найти функцию «extract» ** –

0

Вот решение базовой-R.

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

Мы можем использовать read.table из base R. Нет необходимости в пакетах

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 
Смежные вопросы