将数据框重塑为宽大的形状

use*_*292 2 r

数据包含两个变量:id和grade.每个ID可以为每个等级创建多个记录.

dat <- data.frame(id = c(1,1,1,2,2,2,2,3,3,4,5,5,5),
                  grade = c("a", "b", "c", "a", "a", "b", "b", "d", "f", "c", "a", "e", "f"))
Run Code Online (Sandbox Code Playgroud)

我想将数据重新整形为一个宽大的形状,这样每个id只有一个记录,每个唯一等级变成一个列.每列的值为0或1,具体取决于每个id的等级.

最终的数据集如下:

id  a   b   c   d   e   f
1   1   1   1   0   0   0
2   1   1   0   0   0   0
3   0   0   0   1   0   1
4   0   0   1   0   0   0
5   1   0   0   0   1   1
Run Code Online (Sandbox Code Playgroud)

我试过这个,但没有运气.

  n.dat <- reshape(dat, timevar = "grade",idvar = c("id"),direction = "wide") 
Run Code Online (Sandbox Code Playgroud)

Dav*_*urg 6

您可以简单地table使用值,然后根据> 0条件转换为逻辑,然后使用+一元运算符转换回数字(或者如果您想要更少的高尔夫球,简单地+ 0)

+(table(dat) > 0)
#     grade
# id  a b c d e f
#   1 1 1 1 0 0 0
#   2 1 1 0 0 0 0
#   3 0 0 0 1 0 1
#   4 0 0 1 0 0 0
#   5 1 0 0 0 1 1
Run Code Online (Sandbox Code Playgroud)