2015-07-11 5 views
3

Я пытаюсь разбить вектор символа на три разных вектора внутри кадра данных.Назначение результатов strsplit для нескольких столбцов кадра данных

Мои данные что-то вроде:

> df <- data.frame(filename = c("Author1 (2010) Title of paper", 
           "Author2 et al (2009) Title of paper", 
           "Author3 & Author4 (2004) Title of paper"), 
        stringsAsFactors = FALSE) 

И я хотел бы разделить эти 3 информации (authors, year, title) в трех разных столбцах, так что было бы:

> df 
          filename    author year title 
1   Author1 (2010) Title1   Author1 2010 Title1 
2  Author2 et al (2009) Title2  Author2 et al 2009 Title2 
3 Author3 & Author4 (2004) Title3 Author3 & Author4 2004 Title3 

Я использовал strsplit для разбивки каждого filename в векторе из 3 элементов:

df$temp <- strsplit(df$filename, " \\(|\\) ") 

Но теперь я не могу найти способ поместить каждый элемент в отдельный столбец. Я могу получить доступ к конкретной информации, например, что:

> df$temp[[2]][1] 
[1] "Author2 et al" 

но не могу найти, как поместить его в других столбцах

> df$author <- df$temp[[]][1] 
Error 

ответ

6

С tidyr пакета, вот separate решение:

separate(df, "filename", c("Author","Year","Title"), sep=" \\(|\\) "), remove=F) 
#         filename   Author 
# 1   Author1 (2010) Title of paper   Author1 
# 2  Author2 et al (2009) Title of paper  Author2 et al 
# 3 Author3 & Author4 (2004) Title of paper Author3 & Author4 
# Year   Title 
# 1 2010 Title of paper 
# 2 2009 Title of paper 
# 3 2004 Title of paper 

Ведущие и ведомые пробелы были учтены

6

Вы можете попробовать tstrsplit от версии разви из data.table

library(data.table)#v1.9.5+ 
setDT(df)[, c('author', 'year', 'title') :=tstrsplit(filename, ' \\(|\\) ')] 
df 
#         filename    author year 
#1:   Author1 (2010) Title of paper   Author1 2010 
#2:  Author2 et al (2009) Title of paper  Author2 et al 2009 
#3: Author3 & Author4 (2004) Title of paper Author3 & Author4 2004 
#    title 
#1: Title of paper 
#2: Title of paper 
#3: Title of paper 

Редактировать: Включен паттерн разделения OP, чтобы удалить пробелы.

5
result <- cbind(df, do.call("rbind", strsplit(df$filename, " \\(|\\) "))) 
colnames(result)[2:4] <- c("author", "year", "title") 
2

Существует базовая t -метод (транспонирование) для dataframes:

res <- t(data.frame( strsplit(df$filename, " \\(|\\) "))) 
colnames(res) <- c("author", "year", "title") 
rownames(res) <- seq_along(rownames(res)) 
res 
#-------------- 
    author    year title   
1 "Author1"   "2010" "Title of paper" 
2 "Author2 et al"  "2009" "Title of paper" 
3 "Author3 & Author4" "2004" "Title of paper" 
+0

Отлично! В конце я сделал это: 'df <- cbind (df, t (data.frame (strsplit (df $ filename," \\ (| \\) ")))); colnames (df) [colnames (df) == "1"] <- "author"; colnames (df) [colnames (df) == "2"] <- "year"; colnames (df) [colnames (df) == "3"] <- "title"; rownames (df) <- NULL' –