R - 循环到 x 个数据帧的 n 列中,并在同一图形中绘制每个变量

R - Loop into n columns of x dataframes and plot each variables in the same graph

提问人:FanCou 提问时间:9/29/2023 更新时间:9/29/2023 访问量:24

问:

我一直在看其他类似的帖子,但想不通。 我有大量的数据帧,每个数据帧都有大量的列 n。请务必注意,每个 DataFrame 都具有相同数量的列,具有相同的名称和相同的顺序。

比方说

df1<-data.frame(col1=c(1979:2150),...., coln=c(1:172))
... # many more dataframes with the same format
dfn<-data.frame(col1=c(1979:2150),...., coln(c(1:172)) 

All_dataframes<-list(df1, df2, df3,...,dfn)

我首先尝试为列表的每个数据框的一列创建一个图形,这似乎可以使用以下简单代码(我无法使用 lapply 做到这一点,也很乐意接受建议)

my_plot<-ggplot(bind_rows(All_dataframes, .id = "df"), aes(x=Year, y=col17, colour=df))+
         geom_line()

我现在想创建一个循环来遍历列表中包含的每个数据帧的每个相似列,以在同一图形中绘制这些变量(与之前的示例相同,但不必指定列,我的数据集太大了)。例如,将每个数据帧的所有 col12 绘制在一起,所有 col13、col14...

奖励:我也想为每个变量添加一个geom_smooth......不知道如何添加。

如果答案可以包括对正在做的事情的解释,我将不胜感激。我想了解这些步骤。

谢谢

R 数据帧 列表 循环

评论


答:

1赞 Gregor Thomas 9/29/2023 #1

让我们制作一个可重现的例子,其中包含 2 个 y 列来绘制,以及不同的数据,以便我们判断它是否有效:

df1 <- data.frame(col1=c(2001:2020), col2 = runif(20), col3 = runif(20))
df2 <- data.frame(col1=c(2001:2020), col2 = rnorm(20), col3 = rnorm(20)) 

All_dataframes <- list(df1, df2)
one_dataframe = bind_rows(All_dataframes, .id = "df")

然后,我们可以为绘图制作一个列表,并使用 for 循环来填充列表,使用 inside 来指定不断变化的美学。(我相信该语法是在 ggplot2 3.0 版中引入的。.data[[column_name]]aes().data

## create empty list to put plots in
plot_list = list()

## set which columns we want to use as y values
## as a character vector
y_cols = setdiff(names(one_dataframe), c("df", "col1"))

## loop over the columns and assign the plots to the list
for(col in y_cols) {
  plot_list[[col]] = 
    ggplot(one_dataframe, aes(x = col1, y = .data[[col]], col = df)) +
    geom_point() +
    geom_smooth() + 
    labs(title = col)
}

可以通过数字或列名访问单个绘图:

plot_list[[1]]

enter image description here

plot_list[["col3"]]

enter image description here

评论

0赞 FanCou 9/29/2023
非常感谢你!它有效!快速提问,供我理解:当您将列设置为用作 y 值时,您是否使用 setdiff 来测试唯一的列名?另外,需要把 c(“df”, “col1”) 放在后面吗?最后一个问题:为什么是plot_list[[col]]?这不是你分配给plot_list的情节吗?
0赞 Gregor Thomas 9/29/2023
您可以根据需要构造列名的向量。你可以把它们列出来,你可以构造它们。什么是“除 和 之外的所有列。y_cols = c("col2", "col3", "my_favorite_column")y_cols = paste0("col", 2:100)setdiff(names(one_dataframe), c("df", "col1"))one_dataframedfcol1
0赞 Gregor Thomas 9/29/2023
plot_list[[col]]是名称 一个项目,命名为 的当前值 - 如果它尚不存在,它将创建它。这样做是让你以后使用这些名称的原因,所以你可以这样做,而且它有效。plot_listcolplot_list[["col3"]]