2014-05-18 76 views
0

我必須編寫一個報表,其中交叉表是基於另一個表的頻率排序的。

library(descr) 

X <- c(rep('Anthony', 6), rep('Marcelo', 4), rep('Luiz', 3), rep('Lind', 2), rep('Cesar', 1), rep('Outros', 6), rep('Ninguém', 6), rep('NS/NR', 6)) 
PESO <- rep(1, length(X)) 
REG <- sample(c('R1','R2','R3','R4'), length(X), replace=T) 
bd <- data.frame(X, PESO, REG) 

perc <- (round(freq(bd$X, w=bd$PESO, plot=F), digits=0)) 
perc <- perc[rownames(perc)!="NA's" & rownames(perc)!='NR' & rownames(perc)!='Total',] 
perc <- perc[,-1] 
ns <- perc[names(perc)=='NS/NR'] 
ni <- perc[names(perc)=="Ninguém"] 
ou <- perc[names(perc)=="Outros"] 
perc <- data.frame('%'=sort(perc[names(perc)!='NS/NR' & names(perc)!="Ninguém" & names(perc)!="Outros"], decreasing=T)) 
perc <- rbind(perc,ou,ni,ns) 
rownames(perc)[rownames(perc)==6 | rownames(perc)==7 | rownames(perc)==8] <- c('Outros', 'Ninguém', 'NS/NR') 
perc <- rbind(perc, Total=100, Base=dim(bd)[1]) 

結果是

  X. 
Anthony 18 
Marcelo 12 
Luiz  9 
Lind  6 
Cesar  3 
Outros 18 
Ninguém 18 
NS/NR 18 
Total 100 
Base  34 

現在,當我運行代碼來跨越這個變量,一個又一個,我得到

tab <- round(rbind(prop.table(xtabs(PESO~X+REG, bd),margin=2)*100)) 
ns <- tab[rownames(tab)=='NS/NR',] 
ni <- tab[rownames(tab)=="Ninguém",] 
ou <- tab[rownames(tab)=="Outros",] 
tab <- tab[rownames(tab)!='NS/NR' & rownames(tab)!="Ninguém" & rownames(tab)!="Outros",] 
tab <- tab[order(tab[,1], decreasing=T),] 
perc <- rbind(tab,ou,ni,ns,Total=100,Base=apply(xtabs(PESO~X+REG, bd), 2, sum)) 
rownames(perc)[rownames(perc)=='ou' | rownames(perc)=='ni' | rownames(perc)=='ns'] <- c('Outros', 'Ninguém', 'NS/NR') 
perc <- perc[,colnames(perc)!='Total'] 
:我使用下面的代碼建立第一個表

結果是

  R1 R2 R3 R4 
Anthony 17 14 25 11 
Luiz  17 14 0 11 
Marcelo 17 0 17 11 
Cesar  0 0 0 11 
Lind  0 0 17 0 
Outros 0 43 17 11 
Ninguém 33 14 17 11 
NS/NR 17 14 8 33 
Total 100 100 100 100 
Base  6 7 12 9 

我想讓這個表具有與第一個相同的順序。喜歡的東西:

  R1 R2 R3 R4 
Anthony 17 14 25 11 
Marcelo 17 0 17 11 
Luiz  17 14 0 11 
Lind  0 0 17 0 
Cesar  0 0 0 11 
Outros 0 43 17 11 
Ninguém 33 14 17 11 
NS/NR 17 14 8 33 
Total 100 100 100 100 
Base  6 7 12 9 

我如何能適應我的代碼來解決這個問題?

謝謝

+0

請增加軟件包依賴項,部分代碼不能運行。 'freq錯誤(bd $ X,w = bd $ PESO,plot = F):' – CCurtis

+0

此代碼的'xtable'部分不是重現問題所必需的。請保留它,但包括必要的對象。 – Hugh

+0

請讓您的問題具有可重現性。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

回答

1

你的第一個塊捕捉行順序

perc <- rbind(perc, Total=100, Base=dim(bd)[1]) 
#add 
perc.order <- rownames(perc) 

然後你就可以使用這些列名的最終數據排序後。所以經過

perc <- perc[,colnames(perc)!='Total'] 
#add 
perc[perc.order, ] 

你可以索引擁有使用這些名字,只要它們是作爲一個特徵向量通過行名的元素。這隻會返回第一個表中的值。如果添加了新值,它們將不會包含在輸出中。

相關問題