如何重新整理和总结分类数据从长到宽?

时间:2015-01-09 21:20:15

标签: r database reshape categorical-data

我的数据库就像这样:

db <- data.frame(var1 = c("A", "B", "C", "D", "E"), var2 = c("X", "X", "Y", "Y", "Y"),
           var3 = c("G", "H", "G", "G", "K"))
db

  var1 var2 var3
    A    X    G
    B    X    H
    C    Y    G
    D    Y    G
    E    Y    K

我想基于var2重新整形并计算var3的出现次数以获得此结果:

  var2 var3.G var3.H var3.K
    X    1      1      0
    Y    2      0      1

我已经尝试了演员和重塑功能但没有成功。

4 个答案:

答案 0 :(得分:3)

xtabs功能使用起来相当简单。唯一的认知跳跃是认识到没有LHS,除非你想要对第三个变量求和:

> xtabs( ~var2+var3, data=db)
    var3
var2 G H K
   X 1 1 0
   Y 2 0 1

您不希望对此进行as.data.frame,因为它会转换为长格式,但您可以使用as.data.frame.matrix,因为R - &#39;表格&#39;继承自&#39;矩阵&#39;类。

答案 1 :(得分:2)

tbl <- data.frame( var2 = db[,2], var3 = paste("var3", db[,3], sep = "."))
table(tbl)
    var3
var2 var3.G var3.H var3.K
   X      1      1      0
   Y      2      0      1

答案 2 :(得分:2)

还有一个选择。使用超级有用的data.table包:

library(data.table)

db <- data.table(var1 = c("A", "B", "C", "D", "E"), var2 = c("X", "X", "Y", "Y", "Y"),
           var3 = c("G", "H", "G", "G", "K"))

dcast.data.table(db, var2 ~ var3, fun = length, value.var= 'var3')
   var2 G H K
1:    X 1 1 0
2:    Y 2 0 1

答案 3 :(得分:0)

这是另一种方式:

您可以使用t()和table()的组合。

db <- data.frame(var1 = c("A", "B", "C", "D", "E"), 
                 var2 = c("X", "X", "Y", "Y", "Y"),
                 var3 = c("G", "H", "G", "G", "K"))
db

t(table(db$var3,db$var2))