2013-01-25 33 views
2

伯爵表和百分比表下面的腳本說明我的問題:「疊加」中的R

library(reshape2) 

set.seed(1) 
dummy.df <- data.frame(var_a=sample(letters[1:5],200,replace=TRUE), 
         var_b=sample(1:5,200,replace=TRUE), 
         stringsAsFactors=FALSE) 

temp1 <- addmargins(table(dummy.df[,c("var_a","var_b")]),1) 
temp2 <- formatC(addmargins(prop.table(table(dummy.df[,c("var_a","var_b")]),2),1)*100,digits=2,format="f") 

temp1.melt <- melt(temp1,id.vars="var_a") 
temp2.melt <- melt(temp2,id.vars="var_a") 

temp.output <- merge(temp1.melt,temp2.melt,by=c("var_a","var_b")) 
temp.output[,"value"] <- paste(temp.output[,"value.x"]," (",temp.output[,"value.y"],"%)",sep="") 
temp.output[,"var_a"] <- factor(temp.output[,"var_a"],levels=c("a","b","c","d","e","Sum")) 
temp.output <- dcast(temp.output,formula=var_a~var_b,value.var="value") 

我的一個辦公室平時工作是創建的表格,列出不同的變量之間的頻率,通常我會包括表中的百分比(行/列百分比)也是如此。

之前,我知道函數addmarginsprop.tableas.data.frame.matrix,我使用大量meltdcastreshape2包這樣的伎倆(即將表格轉換爲數據幀,melt它,做相應的部門給予的百分比,然後它)。現在我知道使用三種新的學習功能可以爲我節省很多代碼。

現在我想知道這是否可以提前一步,而不使用我上面提供的腳本,並創建一個行/列的百分比表旁邊的實際計數的表?

回答

3

如果列數爲N,則這取兩個表並重新排列。既然你已經想通了列重命名,我不會與來煩你:

temp12 <- cbind(temp1, temp2) 
stopifnot(ncol(temp1) == ncol(temp2)) 
data.frame(var_a=rownames(temp1), temp12[ ,c(t(matrix(1:10, 5,2))) ]) 
#----- 
    var_a X1 X1.1 X2 X2.1 X3 X3.1 X4 X4.1 X5 X5.1 
a  a 7 15.22 9 18.75 7 17.07 4 14.29 2 5.41 
b  b 13 28.26 12 25.00 6 14.63 5 17.86 9 24.32 
c  c 9 19.57 9 18.75 9 21.95 3 10.71 13 35.14 
d  d 9 19.57 9 18.75 8 19.51 12 42.86 10 27.03 
e  e 8 17.39 9 18.75 11 26.83 4 14.29 3 8.11 
Sum Sum 46 100.00 48 100.00 41 100.00 28 100.00 37 100.00 

(你可以使用相同的矩陣轉置伎倆從構造列名兩個附加的載體選擇)。

+0

啊,它是接近的,但是您的表列數減去了一倍 – lokheart

+0

不確定你的意思。你是指第一列不是組標籤的事實嗎?如果是這樣,就處理好了。 –

+0

@DWin可能會建議用矩陣(seq(1,ncol(temp1)* 2),ncol(temp1),2)'替換矩陣(1:10,5,2)'...... – agstudy