我想创建一个包含图表的命名列表。我从包含唯一ID的向量创建一个列表,用于过滤包含所有信息的主数据帧。
然后我有一个函数,我在lapply中使用循环遍历唯一ID列表来过滤主数据帧并创建绘图。然后我想将每个绘图附加到(最初)初始化列表中,并且我希望列表条目的名称等于lapply中传递的列表值。
下面的代码创建了绘图,但是附加的列表没有传递的列表ID值的相应名称。
我的做法是否错误?我已经看到使用名称(列表)等的问题/答案但是传递给lapply的列表没有命名,我希望传递列表条目成为新列表的名称。
提前致谢!
library(ggplot2)
library(dplyr)
unique_names = as.list(c("apple", "banana", "carrots"))
listy = list()
dframe = data.frame(x_var = seq(1:9)) %>%
mutate(y_var = x_var^3)
temp = data.frame(id = c("apple", "apple", "apple", "banana", "banana", "banana", "carrots", "carrots", "carrots"))
dframe = bind_cols(dframe,
temp)
fun_plots = function(my_list,
my_df,
my_appending_list) {
a = filter(my_df,
id == my_list)
plt = ggplot() +
geom_line(data = a,
aes(x = x_var,
y = y_var))
my_appending_list$my_list = plt
}
plot_list = lapply(unique_names,
fun_plots,
my_df = dframe,
my_appending_list = listy)
答案 0 :(得分:2)
你可以避免编写一个函数并用更多dplyr
魔法来改变列表。如果我理解正确,你需要为“id”变量的每个值设置一个单独的绘图对象 - 如果是这样,你可以对“id”执行group_by
,然后为每个集合生成一个ggplot对象。这是
plot_df <- dframe %>%
group_by(id) %>%
do(plot = ggplot(.data) + geom_line(aes(x = x_var, y = y_var)) + ggtitle(.data$id))
plot_df
#> Source: local data frame [3 x 2]
#> Groups: <by row>
#>
#> # A tibble: 3 x 2
#> id plot
#> * <fctr> <list>
#> 1 apple <S3: gg>
#> 2 banana <S3: gg>
#> 3 carrots <S3: gg>
你可以在id变量上面对一个ggplot2。例如:
ggplot(dframe) + geom_line(aes(x = x_var, y = y_var)) + facet_wrap(~ id)
答案 1 :(得分:1)
您可以取出my_appending_list
参数,因为它目前没有实现任何目标,您不会修改函数中的listy
对象。你可以这样做:
fun_plots = function(my_list,
my_df) {
a = filter(my_df,
id == my_list)
plt = ggplot() +
geom_line(data = a,
aes(x = x_var,
y = y_var))
plt
}
plot_list = lapply(unique_names,
fun_plots,
my_df = dframe)
names(plot_list) = unique_names
答案 2 :(得分:0)
您可以使用dplyr group_by来完成此任务:
library(ggplot2)
library(dplyr)
unique_names = as.list(c("apple", "banana", "carrots"))
listy = list()
dframe = data.frame(x_var = seq(1:9)) %>%
mutate(y_var = x_var^3)
temp = data.frame(id = c("apple", "apple", "apple", "banana", "banana", "banana", "carrots", "carrots", "carrots"))
dframe = bind_cols(dframe,
temp)
dframe <- group_by(dframe, id) %>% do(plots=ggplot(data=.) +
aes(x=x_var, y=y_var) + geom_line() + ggtitle(unique(.$id)))
mylist <- as.list(dframe$plots)
mylist
HTH James