从多个列创建虚拟变量并创建新的数据帧

jon*_*nas 1 r dataframe dummy-variable

我需要根据调查数据制作一个虚拟数据框,其中受访者在数据框中的几列中说出了单词.这是一个简化的例子来说明我需要做什么?这里用一个字母表示一个单词.

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
Run Code Online (Sandbox Code Playgroud)

这是我想要的输出?

> 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
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Fra*_*ank 7

你可以使用reshape2:

library(reshape2)
dcast( melt(df,id.var="id"), id ~ value, length)
Run Code Online (Sandbox Code Playgroud)

这使

  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
Run Code Online (Sandbox Code Playgroud)

或者用recast"一步熔化和浇铸":

recast(df, id ~ value, id.var = "id", length)
Run Code Online (Sandbox Code Playgroud)

不使用包,你可以做到table( rep(df$id,ncol(df)-1), unlist(df[-1]) ).

  • 我正要说reshape2可以做到这一点......很好的答案! (2认同)