Генерация графиков из множества различных информационных фреймов одновременно в R - PullRequest
1 голос
/ 06 июня 2019

Я пытаюсь использовать qplot () для создания множества графиков одновременно. Данные, которые я хотел бы отобразить, хранятся в двух переменных z и x в 86 отдельных фреймах данных с именами от a1 до a86. Я не могу найти простой способ сделать это, так как использование цикла и вставки (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 голосов
/ 06 июня 2019

Это классическая причина использовать один список объектов с аналогичной структурой, а не множество отдельных объектов, которые затопляют вашу глобальную среду и требуют обширного обслуживания и поиска / отзыва. Когда объекты сохраняются в списке, вы можете выполнять согласованные операции с такими элементами, как отдельные qplots или один большой qplot.

Ниже приведены эквивалентные вызовы для сохранения всех фреймов данных в одном именованном списке, но, как @ Грегор советует : избегайте, чтобы куча 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))

Для демонстрации со случайными, посеянными данными девяти кадров данных:

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

0 голосов
/ 06 июня 2019

Это на самом деле довольно изобретательный способ его кодирования, если он похож на R, а не через тысячу лет, главная проблема в вашем решении состоит в том, что r не распознает n, поскольку ваши dfs n являются просто строкой.

Я даже не уверен, что это был бы лучший способ сделать это, поскольку мы могли бы сгруппировать ваши 87 dfs и нанести их на график, но это так.

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...