我正在尝试比较两个问题(列Q1_b
和Q2_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)
我已经尝试了多年来解决这个问题,但我没有得到任何结果。有人可以帮忙吗?
答案 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)