如何避免降低0频率的水平

时间:2012-11-22 14:01:42

标签: r

我正在尝试比较两个问题(列Q1_bQ2_b)并将它们彼此相邻(在同一个条形图中)绘制,答案选项为1-6。问题是,Q1_b没有人回答4,所以barplot跳到显示5 {4}应该是Q1_b,旁边是Q2_b回答4的人的百分比。如果没有特定选项的答案,我如何确保R不会这样做并自动输入0%列?

alldataset<-structure(list(Q1_b = c(6L, 1L, 5L, 3L, 5L, 6L, 6L, 2L), 
                           Q2_b = c(1L, 2L, 2L, 5L, 4L, 3L, 6L, 1L)), 
                      .Names = c("Q1_b", "Q2_b"), 
                      class = "data.frame", 
                      row.names = c(NA, -8L))

Qb<-table(alldataset$Q2_b)
Qf<-table(alldataset$Q1_b)

nrowFUP<-NROW(alldataset$Q1_b)
nrowBL<-NROW(alldataset$Q2_b)

options(digits=6)
newbl <- transform(as.data.frame(table(alldataset$Q2_b)),    
                 percentage_column=Freq/nrowBL*100)

newfup <- transform(as.data.frame(table(alldataset$Q1_b)), 
                    percentage_column=Freq/nrowFUP*100)


matrixQ1<-cbind(newbl$percentage_column, newfup$percentage_column)

matrixQ1dataframe<-data.frame(matrixQ1)
rmatrixQ1<-as.vector(t(matrixQ1dataframe))
roundedrmatrix<-round(rmatrixQ1, digits=0)
barplotmatrix<-matrix(roundedrmatrix)

par(mar=c(7.5,4,3,2), mgp=c(2,.7,0), tck=-.01, las=1, xpd=TRUE)

 b<-barplot(matrix(roundedrmatrix, nr=2), 
           beside=T, xlab="",
           ylab="Percentage",
           cex.lab=0.9, 
           main="Comparison",
           cex.main=0.9, ylim=c(0,70), 
           col=c("black","yellow"), 
           names.arg=c(1:6),
           legend=c("Q2_b","Q1_b"),
           args.legend=list(x="bottomleft", 
                            cex=0.8,
                            inset=c(0.4,-0.4)))
text(x=b, y=roundedrmatrix,labels=roundedrmatrix, pos=3, cex=0.8)

R还警告我,这将通过显示:

来实现
Warning message:
In cbind(newbl$percentage_column, newfup$percentage_column) :
  number of rows of result is not a multiple of vector length (arg 2)

我已经尝试了多年来解决这个问题,但我没有得到任何结果。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

问题是你从未告诉R你的矢量代表潜在值为1-6的分类响应,所以它不知道包含0个计数(你不希望它包括0,7,8, 100万等。)。

尝试用以下内容替换前2行:

Qb<-table(factor(alldataset$Q2_b, levels=1:6))
Qf<-table(factor(alldataset$Q1_b, levels=1:6))

或运行类似的东西:

alldataset$Q1_b <- factor(alldataset$Q1_b, levels=1:6)
alldataset$Q2_b <- factor(alldataset$Q2_b, levels=1:6)
在表命令之前

答案 1 :(得分:2)

您需要告诉table使用table(factor(x, seq.int(6)))一到六的所有值。

以下是代码的改进版本:

dat <- t(round(sapply(rev(alldataset),
                      function(x) table(factor(x, seq.int(6)))) / 
                                                         nrow(alldataset) * 100))

par(mar=c(7.5,4,3,2), mgp=c(2,.7,0), tck=-.01, las=1, xpd=TRUE)
b <- barplot(dat, beside=T,xlab="", ylab="Percentage", cex.lab=0.9, 
             main="Comparison", cex.main=0.9, ylim=c(0,70), 
             col=c("black","yellow"), names.arg=c(1:6), legend=names(dat), 
             args.legend=list(x="bottomleft", cex=0.8, inset=c(0.4,-0.4)))
text(x=b, y=dat,labels=dat, pos=3, cex=0.8)

enter image description here