2015-01-09 84 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))