R动态命名要在ggplot2中使用的数据框
R dynamically naming a data frame to be used in ggplot2
是的,我知道有很多关于在 R 中动态命名变量的问题,是的,我已经复习过了,不,我仍然不能做我想做的事情。
我创建了五个不同的数据框,每个数据框都包含来自另一个数据框的选定信息。我想将这些较小的数据帧中的每一个发送到 ggplot。我已经创建了框架,但我似乎无法让 ggplot 解析动态数据框架名称。我试过各种版本的赋值,as.name.
这是我截断的代码:
Alist <- unique(bigdf$initial.A)
Blist <- unique(bigdf$initial.B)
for ( i in Alist ) {
for ( j in Blist ) {
assign( paste0("a", i, "b", j ), bigdf %>%
filter( initial.A == i, initial.B == j ))
}
}
效果很好,我创建了正确数量的数据帧,正确命名并包含正确的信息:a5b10、a5b20、a5b30、a10b10、a10b20 和 a10b30。
for (i in Alist) {
for (j in Blist ) {
png(paste0("a", i, "b", j, ".png"))
useframe <- as.name(paste0("a", i, "b", j))
ggplot(useframe, aes(step)) + . . .
}
}
错误通常是这样的:ggplot2 不知道如何处理 class 字符(或 class 名称)的数据。
如何创建动态名称并为其分配匹配内容 data.frame?
如果您希望我使用列表,我需要更好地了解它在此处的应用方式。
get
应该可以解决您的问题:
for (i in Alist){
for (j in Blist){
png(paste0("a", i, "b", j, ".png"))
useframe <- paste0("a", i, "b", j)
ggplot(get(useframe), aes(x = step)) + geom_density()
}
}
但是您可以轻松地消除所有这些混乱,并使用 doParallel
对 data.table
:
进行二进制搜索
library(doParallel)
library(data.table)
bigDT <- setDT(bigdf)
setkeyv(bigDT, c("intial.A", "initial.B"))
foreach(i = seq(Alist)) %do% {
foreach(j = seq(Blist)) %do% {
x <- bigDT[J(c(Alist[i], Blist[i]))]
png(paste0("a", i, "b", j, ".png"))
ggplot(x, aes(step)) + . . .
}
}
为什么不能将所有数据放在一起并使用分面网格?
编辑:
library(ggplot2)
library(dplyr)
library(magrittr)
plot_data = function(sub_df) {
filename =
sub_df %>%
use_series(gear) %>%
first %>%
sprintf("gear_%s.pdf", .)
(ggplot(sub_df) +
aes(x = wt, y = mpg) +
geom_point() ) %>%
ggsave(filename, .)
data_frame()
}
mtcars %>%
group_by(gear) %>%
do(plot_data(.) )
是的,我知道有很多关于在 R 中动态命名变量的问题,是的,我已经复习过了,不,我仍然不能做我想做的事情。
我创建了五个不同的数据框,每个数据框都包含来自另一个数据框的选定信息。我想将这些较小的数据帧中的每一个发送到 ggplot。我已经创建了框架,但我似乎无法让 ggplot 解析动态数据框架名称。我试过各种版本的赋值,as.name.
这是我截断的代码:
Alist <- unique(bigdf$initial.A)
Blist <- unique(bigdf$initial.B)
for ( i in Alist ) {
for ( j in Blist ) {
assign( paste0("a", i, "b", j ), bigdf %>%
filter( initial.A == i, initial.B == j ))
}
}
效果很好,我创建了正确数量的数据帧,正确命名并包含正确的信息:a5b10、a5b20、a5b30、a10b10、a10b20 和 a10b30。
for (i in Alist) {
for (j in Blist ) {
png(paste0("a", i, "b", j, ".png"))
useframe <- as.name(paste0("a", i, "b", j))
ggplot(useframe, aes(step)) + . . .
}
}
错误通常是这样的:ggplot2 不知道如何处理 class 字符(或 class 名称)的数据。
如何创建动态名称并为其分配匹配内容 data.frame?
如果您希望我使用列表,我需要更好地了解它在此处的应用方式。
get
应该可以解决您的问题:
for (i in Alist){
for (j in Blist){
png(paste0("a", i, "b", j, ".png"))
useframe <- paste0("a", i, "b", j)
ggplot(get(useframe), aes(x = step)) + geom_density()
}
}
但是您可以轻松地消除所有这些混乱,并使用 doParallel
对 data.table
:
library(doParallel)
library(data.table)
bigDT <- setDT(bigdf)
setkeyv(bigDT, c("intial.A", "initial.B"))
foreach(i = seq(Alist)) %do% {
foreach(j = seq(Blist)) %do% {
x <- bigDT[J(c(Alist[i], Blist[i]))]
png(paste0("a", i, "b", j, ".png"))
ggplot(x, aes(step)) + . . .
}
}
为什么不能将所有数据放在一起并使用分面网格?
编辑:
library(ggplot2)
library(dplyr)
library(magrittr)
plot_data = function(sub_df) {
filename =
sub_df %>%
use_series(gear) %>%
first %>%
sprintf("gear_%s.pdf", .)
(ggplot(sub_df) +
aes(x = wt, y = mpg) +
geom_point() ) %>%
ggsave(filename, .)
data_frame()
}
mtcars %>%
group_by(gear) %>%
do(plot_data(.) )