我有一个数据框列表 df_list = (df1,df2,df3),所有数据框的维度相同,但列名称不同。我在 for 循环中调用 ggplot:
for(i in 1:3){
p = ggplot(df_list[[i]], aes(x=df_list[[i]][1], y=df_list[[i]][3], fill=df_list[[i]][2])) +
geom_bar(stat='identity', position='dodge')
}
Run Code Online (Sandbox Code Playgroud)
然而,R 不允许我这样做:我必须实际使用变量名称,这意味着我不能使用循环。有什么解决办法吗?
这是示例数据:
df1<-data.frame(order=c(1:3,4:6), gender=c('f','f','f','m','m','m'), count= c(10,20,30,20,25,30))
df2<-data.frame(order11=c(2:4,2:4), gender11=c('f','f','f','m','m','m'), count= c(11,21,30,21,25,30))
df3<-data.frame(order22=c(1:3,4:6), gender22=c('f','f','f','m','m','m'), count= c(10,20,31,21,25,30))
> df1
order gender count
1 1 f 10
2 2 f 20
3 3 f 30
4 4 m 20
5 5 m 25
6 6 m 30
>
Run Code Online (Sandbox Code Playgroud)
您的数据框中可能有不同的列名称,但列的角色似乎是由它们在数据框中的索引定义的。例如,您希望 thr 数据框中的第一列定义图中的 x 值等。这意味着您可以使用names()并aes_string()获得您想要的东西。
首先定义一些测试数据,因为您还没有给我们任何数据。
library(tidyverse)
df1 <- tibble(x1=rnorm(10), y1=rnorm(10), z1=rep(c("A", "B"), each=5))
df2 <- tibble(x2=rnorm(10), y2=rnorm(10), z2=rep(c("A", "B"), each=5))
df3 <- tibble(x3=rnorm(10), y3=rnorm(10), z3=rep(c("A", "B"), each=5))
dfList <- list(df1, df2, df3)
Run Code Online (Sandbox Code Playgroud)
现在解决问题
lapply(
dfList,
function(df) {
names <- names(df)
df %>% ggplot(aes_string(x=names[1], y=names[2], colour=names[3])) + geom_point()
}
)
Run Code Online (Sandbox Code Playgroud)
给予
我使用了geom_point()andcolour而不是geom_bar()andfill但同样的原则也适用。