1

我正在尝试比较两个问题(列Q1_bQ2_b)并将它们彼此相邻(在同一个条形图中),答案选项是 1-6。问题是没有人回答 4 for Q1_b,所以条形图跳到显示 5 应该是 4 的地方Q1_b,旁边是回答 4 for 的人的百分比Q2_b。如果没有针对特定选项的任何答案,我如何确保 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)

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

4

2 回答 2

3

问题是您从未告诉 R 您的向量代表潜在值为 1-6 的分类响应,因此它不知道包含 0 计数(您不希望它包含 7、8、1 百万的 0, ETC。)。

尝试将您的第一 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)

在表命令之前。

于 2012-11-22T14:31:47.517 回答
2

您需要告诉table使用 1 到 6 的所有值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)

在此处输入图像描述

于 2012-11-22T14:34:15.020 回答