2015-10-06 6 views
2

Я пытаюсь разделить одну переменную «символ» в моем ядре данных на переменные «множитель».Разделить столбец на несколько двоичных фиктивных столбцов

> sampledf=data.frame(vin=c('v1','v2','v3'),features=c('f1:f2:f3','f2:f4:f5','f1:f4:f5')) 
> sampledf 
    vin features 
1 v1 f1:f2:f3 
2 v2 f2:f4:f5 
3 v3 f1:f4:f5 

> desireddf=data.frame(vin=c('v1','v2','v3'),f1=c(1,0,1),f2=c(1,1,0),f3=c(1,0,0),f4=c(0,1,1),f5=c(0,1,1)) 
> desireddf 
    vin f1 f2 f3 f4 f5 
1 v1 1 1 1 0 0 
2 v2 0 1 0 1 1 
3 v3 1 0 0 1 1 

Я попытался с помощью strsplit() отделить «особенность» колонкам

strsplit(as.character(df$features), ";") 

, но не имел никакой удачи факторизации их.

ответ

3

Мы можем использовать mtabulate от qdapTools после расщепления (strsplit(..) колонки «функции».

library(qdapTools) 
cbind(sampledf[1],mtabulate(strsplit(as.character(sampledf$features), ':'))) 
# vin f1 f2 f3 f4 f5 
#1 v1 1 1 1 0 0 
#2 v2 0 1 0 1 1 
#3 v3 1 0 0 1 1 

Или мы можем использовать cSplit_e из library(splitstackshape)

library(splitstackshape) 
df1 <- cSplit_e(sampledf, 'features', ':', type= 'character', fill=0, drop=TRUE) 
names(df1) <- sub('.*_', '', names(df1)) 

или с помощью base R методов мы split, как и раньше, установить имена list элементов из strsplit с колонкой «Vin», преобразовать в ключ/значение столбца data.frame 'с использованием stack, получить table, транспонировать и cbind с первым столбцом' sampledf '.

cbind(sampledf[1], 
t(table(stack(setNames(strsplit(as.character(sampledf$features), ':'), 
       sampledf$vin))))) 
+0

Они отлично работают, акрун! Но есть ли способ сделать это, используя базовые функции? – outlier123

+0

@ outlier123 добавлен базовый вариант R. – akrun

+0

потрясающий! Большое спасибо Akrun !! (Rep слишком низко, чтобы публично публиковать) – outlier123

Смежные вопросы