2

以下のスクリプトは私の質問を示しています。

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

オフィスでの私の通常の仕事の1つは、異なる変数間の頻度をリストするテーブルを作成することです。通常、テーブルにはパーセンテージ(行/列のパーセンテージ)も含めます。

addmargins関数、、prop.tableを知る前に、パッケージからas.data.frame.matrix多くのを使用meltしてトリックを実行します(つまり、テーブルをデータフレームに変換し、適切な除算を行ってパーセンテージを指定してから、それを実行します)。これで、3つの新しい学習関数を使用すると、多くのコードを節約できることがわかりました。dcastreshape2meltdcast

ここで、上記のスクリプトを使用せずに、これが一歩先に進み、実際の数の横に行/列のパーセンテージが存在するテーブルを作成できるかどうか疑問に思います。

4

1 に答える 1

3

列の数がNの場合、これは2つのテーブルを取り、再配置します。列の名前の変更を理解したので、私はそれであなたを退屈させません:

 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

(同じ行列転置トリックを使用して、作成された列名の2つの追加されたベクトルから選択できます。)

于 2013-01-25T02:25:26.683 に答える