Создайте фиктивные переменные из нескольких столбцов и создайте новый фрейм данных

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

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

Любые идеи?


person jonas    schedule 21.09.2015    source источник
comment
Что представляет собой v.X? Как вы хотите, чтобы они сводились к желаемому результату? Вам нужен счет, т.е. если id 1 строка была "a", "b", "a", вы бы хотели, чтобы a было 2?   -  person MikeRSpencer    schedule 21.09.2015
comment
содержимое в v.X - это отдельные слова, поэтому они являются векторами символов.   -  person jonas    schedule 21.09.2015
comment
респонденты могут выбрать только одно слово, поэтому нет необходимости суммировать или считать.   -  person jonas    schedule 21.09.2015
comment
Посмотрите на ответ Фрэнка, что бы я написал!   -  person MikeRSpencer    schedule 21.09.2015
comment
см. предыдущие ответы, используя model.matrix() ...   -  person Ben Bolker    schedule 21.09.2015
comment
@BenBolker Для меня не очевидно, где можно найти эти предыдущие ответы. Вы забыли отметить дурак?   -  person Frank    schedule 21.09.2015


Ответы (1)


Вы можете использовать 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]) ).

person Frank    schedule 21.09.2015
comment
Я как раз собирался сказать, что reshape2 может это сделать... хороший ответ! - person MikeRSpencer; 21.09.2015