我正在尝试使用R中的for
循环从列联表快速生成几个ggplot2
图。每个变量(R1...R7
)由单个变量(segment_r
)分割。
我编写了以下循环,但不断收到错误。
question_names<-paste("R",1:7,sep='') # Create list with question names
attach(df)
for (i in length(question_names)) {
question_names[i]<-factor(question_names[i])
means<-prop.table(table(get(question_names[i]),segment_r),2)*100
means.long<-melt(means,id.vars="segment_r")
p<-ggplot(means.long,aes(x=Var1,y=value,fill=factor(Var2)))+
geom_bar(stat="identity",position="dodge")+coord_flip()+
scale_fill_discrete(name="Segment",
breaks=c(1:4),
labels=c(1:4))+
xlab("")+ylab("Mean Percentage")
p <- p + facet_wrap( ~ Var2, ncol=4)
p
}
detach(df)
我尝试在table
中包含get
,这会产生错误:Error in get(question_names[i]) : object '1' not found
)。然而,省略get
也是行不通的:Error in table(question_names[i], segment_r) : all arguments must have the same length
。
有什么想法?我也对一种不使用loop
就能生成多个图形的解决方案持开放态度--在这里追求速度。
对于每个请求,示例数据如下:
df <- read.csv(text="R1, R2, R3, R4, R5, R6, R7, segment_r
Apples, Fruit salad, Pasta, Mexican, Apples, Cheese, Salad, Segment 1
Apples, Fruit salad, Pasta, Mexican, Apples, Cheese, Salad, Segment 1
Oranges, Fruit salad, Pasta, Mexican, Oranges, Cheese, Salad, Segment 1
Oranges, Fruit salad, Pasta, Mexican, Oranges, Cheese, Salad, Segment 1
Oranges, Fruit salad, Pasta, Thai, Oranges, Cheese, Salad, Segment 1
Oranges, Fruit salad, Pasta, Thai, Oranges, Cheese, Salad, Segment 1
Oranges, Fruit salad, Pasta, Thai, Oranges, Cheese, Salad, Segment 2
Oranges, Ice cream, Pasta, Thai, Oranges, Milk, Salad, Segment 2
Bananas, Ice cream, Pasta, Thai, Bananas, Milk, Salad, Segment 2
Bananas, Ice cream, Pasta, Chinese, Bananas, Milk, Salad, Segment 2
Bananas, Ice cream, Pasta, Chinese, Bananas, Milk, Salad, Segment 2
Bananas, Pie, Pasta, Chinese, Bananas, Milk, Side, Segment 2
Bananas, Pie, Pasta, Chinese, Bananas, Milk, Side, Segment 2
Bananas, Pie, Pizza, Chinese, Bananas, Milk, Side, Segment 3
Bananas, Pie, Pizza, Chinese, Bananas, Milk, Side, Segment 3
Apples, Fruit salad, Pasta, Mexican, Apples, Milk, Side, Segment 4
Apples, Fruit salad, Pasta, Mexican, Apples, Milk, Side, Segment 4
Oranges, Fruit salad, Pasta, Mexican, Oranges, Milk, Side, Segment 4
Oranges, Fruit salad, Pasta, Mexican, Oranges, None, Side, Segment 4
Oranges, Fruit salad, Pasta, Thai, Oranges, None, Side, Segment 1
Oranges, Fruit salad, Pasta, Thai, Oranges, None, Side, Segment 1
Oranges, Fruit salad ,Pasta, Thai, Oranges, None, Side, Segment 2
Oranges, Ice cream, Pasta, Thai, Oranges, None, Side, Segment 2
Bananas, Ice cream, Pasta, Thai, Bananas, None, Side, Segment 2
Bananas, Ice cream, Pasta, Chinese, Bananas, None, Fries, Segment 2
Bananas, Ice cream, Pasta, Chinese, Bananas, None, Fries, Segment 2
Bananas, Pie, Pasta, Chinese, Bananas, None, Fries, Segment 2
Bananas, Pie, Pasta, Chinese, Bananas, None, Fries, Segment 2
Bananas, Pie, Pizza, Chinese, Bananas, None, Fries, Segment 3
Bananas, Pie, Pizza, Chinese, Bananas, None, Fries, Segment 3")
发布于 2018-06-05 04:11:41
我不清楚你到底想用这些情节“做什么”。但是把你的代码翻译成“能用”的代码可能是这样的
library(reshape2)
library(ggplot2)
question_names <- paste("R", 1:7, sep='') # Create list with question names
for (q in question_names) {
means <- prop.table(table(df[[q]], df[["segment_r"]]),2)*100
means.long <- melt(means, id.vars="segment_r")
p <- ggplot(means.long, aes(x=Var1, y=value, fill=factor(Var2)))+
geom_bar(stat="identity",position="dodge") + coord_flip()+
scale_fill_discrete(name="Segment",
breaks=c(1:4),
labels=c(1:4))+
xlab("")+ylab("Mean Percentage")
p <- p + facet_wrap( ~ Var2, ncol=4)
print(p)
}
这将把所有的绘图放到图形窗口中(尽管最后一个绘图覆盖了前一个绘图)。但这至少摆脱了attach()
和get()
。
https://stackoverflow.com/questions/50687515
复制相似问题