2015-01-09 45 views
0

我的数据库是像这样的:如何重塑和总结从长到宽的分类数据?

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 

我曾尝试演重塑功能没有成功。

回答

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-'table'从'矩阵'类继承。

+0

更优雅的解决方案!我会等一段时间来检查它。 – 2015-01-09 21:46:57

+0

我不需要检查,RStudent有一个更完整的答案。 – 2015-01-09 21:53:02

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 
+0

非常聪明的解决方案!我将只添加:'tbl < - as.data.frame.matrix(table(tbl))'。 – 2015-01-09 21:36:53

+0

谢谢!如果你这样做,结果看起来很不一样... – DatamineR 2015-01-09 21:39:32

+0

是的......第一个柱头变成了rownames – 2015-01-09 21:44:24

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 
0

这里是另一种方式去了解它:

可以使用T的组合()和表()。

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))