2015-10-11 8 views
1

Я пытаюсь разбить столбец на несколько столбцов с помощью «_» в качестве разделителя. Я попытался решения здесь:Разделить столбец с неправильным текстом на несколько столбцов в r

Splitting a dataframe string column into multiple different columns

В моем случае, проблема, кажется, что число «разделителями» текстовых сегментов варьируется в зависимости от строк (находится в диапазоне от 3 до 5), потому что я постоянно получаю ошибки всякий раз, когда я пытаюсь разделить строки, а затем преобразовать в матрицу или фрейм. Вот пример того, вы можете скопировать в R:

example<-structure(list(c1 = c(1, 2, 3), temp2 = structure(c(3L, 1L, 2L 
), .Label = c("TR117_1119_HI_33", "TR504_1115_Su1_Y_4", "TR9_0817_2" 
), class = "factor")), .Names = c("c1", "temp2"), row.names = c(NA, 
-3L), class = "data.frame") 

Для этого примера, в конечном счете, я хотел бы столбец «temp2» быть parced друг на «_», чтобы произвести следующее:

> Output 
    new1 new2 new3 new4 new5 
1 TR9 0817 2 NA NA 
2 TR117 1119 HI 33 NA 
3 TR504 1115 Su1 Y 4 

Вот насколько я получил, не сталкиваясь ошибки:

example$temp3<-as.character(example$temp2) 
test<-strsplit(example$temp3,"_") 

мне нужно использовать цикл, чтобы сделать эту строку за строкой или есть более элегантное решение делать?

ответ

1

Вы можете использовать tidyr «s separate()

tidyr::separate(example[-1], temp2, paste0("new", 1:5), "_", fill = "right") 
# new1 new2 new3 new4 new5 
# 1 TR9 0817 2 <NA> <NA> 
# 2 TR117 1119 HI 33 <NA> 
# 3 TR504 1115 Su1 Y 4 

Добавить convert = TRUE, если вы хотите, чтобы новые столбцы, которые будут преобразованы в соответствующие типы.

1

Мы могли бы также использовать tstrsplit из library(data.table)

library(data.table)#v1.9.6+ 
setnames(setDT(example)[, tstrsplit(temp2, '_')], paste0('new', 1:5))[] 
# new1 new2 new3 new4 new5 
#1: TR9 0817 2 NA NA 
#2: TR117 1119 HI 33 NA 
#3: TR504 1115 Su1 Y 4 

ПРИМЕЧАНИЕ: Это также имеет type.convert аргумент, который может преобразовать в соответствующие типы.


Или cSplit из library(splitstackshape)

library(splitstackshape) 
cSplit(example, 'temp2', '_')[,c1:=NULL][] 

и изменить имена столбцов с setnames, как описано выше.


Или с помощью read.table из base R

read.table(text=as.character(example$temp2), sep="_", na.strings='', 
       stringsAsFactors=FALSE,fill=TRUE, col.names=paste0('new', 1:5)) 
# new1 new2 new3 new4 new5 
#1 TR9 817 2 <NA> NA 
#2 TR117 1119 HI 33 NA 
#3 TR504 1115 Su1 Y 4 
Смежные вопросы