2015-09-21 2 views
1

Мне нужно сделать dataframe манекенов из данных опроса, где респонденты заявили слова в нескольких столбцах в кадре данных. Вот упрощенный пример, чтобы проиллюстрировать, что мне нужно сделать? Одно слово здесь представлено письмом.Сделать фиктивные переменные из нескольких столбцов и создать новый dataframe

id <- c(1:6) 
v.1 <- c("a","b","d","e","a","c") 
v.2 <- c("b","a","a","a","b","a") 
v.3 <- c("e","c","b","b","e","b") 

df <- data.frame(id,v.1,v.2,v.3) 

> df 
    id v.1 v.2 v.3 
1 1 a b e 
2 2 b a c 
3 3 d a b 
4 4 e a b 
5 5 a b e 
6 6 c a b 

Это мой желаемый выход?

> print(df.dummy) 
    id a b c d e 
1: 1 1 1 0 0 1 
2: 2 1 1 1 0 0 
3: 3 1 1 0 1 0 
4: 4 1 1 0 0 1 
5: 5 1 1 0 0 1 
6: 6 1 1 1 0 0 

Любые идеи?

+0

Что представляет v.X? Как вы хотите, чтобы эти сокращения уменьшались до желаемого результата? Вам нужен счет, т. Е. Если строка 'id 1' была' "a", "b", "a" 'вы хотите, чтобы было 2? – MikeRSpencer

+0

содержание в v.X - это одиночные слова, поэтому они являются векторами-символами. – jonas

+0

респонденты могут выбрать только одно слово, поэтому не нужно суммировать или подсчитывать. – jonas

ответ

7

Вы можете использовать reshape2:

library(reshape2) 
dcast(melt(df,id.var="id"), id ~ value, length) 

который дает

id a b c d e 
1 1 1 1 0 0 1 
2 2 1 1 1 0 0 
3 3 1 1 0 1 0 
4 4 1 1 0 0 1 
5 5 1 1 0 0 1 
6 6 1 1 1 0 0 

Или использовать recast к "плавятся и отлиты в одном шаге":

recast(df, id ~ value, id.var = "id", length) 

без использования пакета , вы можете сделать table(rep(df$id,ncol(df)-1), unlist(df[-1])).

+2

Я как раз собирался сказать, что reshape2 может это сделать ... хороший ответ! – MikeRSpencer

+0

Спасибо, отличный ответ – jonas

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