在R中一次生成许多不同数据框的图

时间:2019-06-06 02:49:54

标签: r

我正在尝试使用qplot()一次创建许多图形。我想绘制的数据存储在名为a1到a86的86个单独的数据帧中的两个变量z和x中。我似乎找不到一种简单的方法来执行此操作,因为使用循环和粘贴(a,counter_variable,sep =“”)对我来说还没有成功。

例如-不知道为什么我不能这样做:

M<-1
while(M<87){
n<-paste("a",M,sep=""))
qplot(n$z, n$x, geom='smooth')
M=M+1
}

(顺便说一句,我意识到可能有一个非常简单的解决方案)

2 个答案:

答案 0 :(得分:0)

实际上,这是一种非常巧妙的编码方式,就像R一样,而不是在一千年内,解决方案的主要问题是r无法识别n,因为dfs n只是一个字符串。

我什至不确定这是否是最好的方法,因为我们可以对87个df进行分组并绘制它们,但是就在这里。

library(tidyverse)
df1 <- tibble(a = sample(1:100,100),b = sample(1:100,100))
df2 <- tibble(a = sample(1:100,100),b = sample(1:100,100))

M <- 1
while(M<3){
n <- paste("df",M,sep = "")  
n <- get(n)
Sys.sleep(0)
i <- qplot(n[["a"]],n[["b"]],geom = "smooth")
Sys.sleep(0)
print(i)
M = M +1
}

答案 1 :(得分:0)

这是使用一个结构相似的对象列表而不是许多单独对象的经典原因,这会淹没您的全局环境,并且需要大量维护和搜索/调用。将对象保存到列表后,您可以对单个qplots或一个大qplot等元素运行一致的操作。

以下是等效的调用,用于将所有数据帧保存到单个命名列表中,但保存为@Gregor advises避免将一堆data.frames不在列表中 ... 不要等到一堆data.frames才能将它们添加到列表中。从列表开始。

df_list <- Filter(is.data.frame, eapply(.GlobalEnv, identity))

df_list <- Filter(is.data.frame, mget(x=ls(), envir=.GlobalEnv))

从此处开始,对各个图使用lapply或将所有数据帧连接到带有指标字段和运行面的单个数据帧中。

# INDIVIDUAL PLOTS ------------------------------------------------
lapply(df_list, function(df) qplot(df$z, df$x, geom='smooth'))


# SINGLE PLOT -----------------------------------------------------
# ADD INDICATOR COLUMN IN EACH DF
df_list <- Map(function(df, nm) transform(df, a_name = nm), df_list, names(df_list))

# CONCATENATE ALL DF ELEMENTS
final_df <- do.call(rbind, unname(df_list))

# QPLOT WITH FACETS
with(final_df, qplot(z, x, geom='smooth', facets= ~ num))

使用9个数据帧的随机种子数据进行演示:

set.seed(662019)
a_names <- paste0("a", 1:9)

# BUILD DF LIST EACH WITH INDICATOR COLUMN
df_list <- lapply(a_names, function(i) data.frame(a_name = i, x = runif(100), z = runif(100)))

# CONCATENATE ALL DF ELEMENTS
final_df <- do.call(rbind, unname(df_list))

# QPLOT WITH FACETS
with(final_df, qplot(z, x, geom='smooth', facets= ~ a_name))

Plot Output