我正在尝试构建一个使用ggplot2循环的函数。以下代码工作正常,我可以得到数据框的每个变量的条形图:
library(ggplot2)
DF=data.frame(A=c(1,2,1,2,3,2,1,2,3,1,2,3),B=c(2,3,2,2,1,2,3,2,1,2,2,2),C=c(2,3,2,1,1,2,1,1,2,1,2,3))
data_name<-data.frame("A","B","C")
Plot_Graph<-function(x,na.rm=T){
nm=names(x)
for (i in seq_along(nm)) {
print(ggplot(x,aes(x=nm[i],y=x[,i],fill=factor(x[,i]))) +
geom_bar(width=1,stat="identity")+
coord_polar(theta="y")+
ggtitle(data_name[1,i])+
guides(fill=guide_legend(title=NULL))+
scale_fill_discrete(breaks=c('1','2','3'),
labels=c('A','B','C')))}}
Plot_Graph(DF)
然而,当我尝试为每个变量创建一个饼图时,只观察到'1'和'2'(不为每个变量选择'3'),每次都会给我同样的错误:
错误:美学必须是长度1或与数据(1)相同:x,y,fill
我尝试了以下代码:
Plot_Bar<-function(x,na.rm=T){
nm=names(x)
for (i in seq_along(nm)) {
x1<-subset(x,nm[i] %in% c('1','2'))
print(ggplot(x1,aes(x=nm[i],y=x1[,i],fill=factor(x1[,i]))) +
geom_bar(width=1,stat="identity")+
coord_polar(theta="y")+
ggtitle(data_name[1,i])+
guides(fill=guide_legend(title=NULL))+
scale_fill_discrete(breaks=c('1','2'),
labels=c('A','B')))}}
但它不起作用。我该怎么做才能为每个变量创建一个合适的条形图,只包含'1'和'2'的观察结果?
非常感谢。
答案 0 :(得分:1)
您的subset()
不正确。如果你要打印x1
,你会发现它总是空着的。您可以在R中交换字符值和符号名称。在这两种情况下,您需要使用不同类型的提取。这是重新编写子集的一种可能方法
x1 <- x[x[[nm[i]]] %in% c('1','2'), ]
当您需要为列名使用字符串时,您不能(轻松)使用subset()
。