使用lapply遍历数据框列表绘制箱线图时遇映射错误及标题设置问题求助
解决ggplot箱线图遍历数据框列表的问题:映射错误与标题设置
我来帮你一步步拆解并解决这两个问题:
1. 先处理映射报错的根源
你遇到的Error: Mapping should be created with aes() or aes_(),问题出在ggplot的语法使用上——当你把df传给ggplot的第一个参数后,aes内部直接引用列名(或用.data指代当前数据集)即可,不需要再额外加df[,4]这种外部数据引用方式,这会让ggplot混淆数据映射关系。
2. 搞定标题的基因名获取
每个数据框的第一列都是重复18次的同一基因名,所以直接取该列的第一个元素就能拿到对应的基因名称(因为所有值都一致,取任意一个都可以),比如df[[1]][1]。
修正后的完整函数
下面是调整后的代码,两种写法供你选择:
写法一:按列位置引用(适合不知道列名的情况)
box <- function(df) { # 提取当前数据框对应的基因名 gene_name <- df[[1]][1] df %>% ggplot(aes(x = .data[[names(df)[4]]], y = .data[[names(df)[2]]])) + geom_boxplot() + ggtitle(gene_name) }
写法二:直接用列名(如果你知道列名的话更直观)
假设第二列叫expression,第四列叫sample_group,第一列叫gene,可以写成:
box <- function(df) { gene_name <- df$gene[1] df %>% ggplot(aes(x = sample_group, y = expression)) + geom_boxplot() + ggtitle(gene_name) }
运行测试
直接调用lapply(df_list, box)就可以生成每个基因对应的箱线图了。
如果你的df_list是带命名的(每个元素的名字就是对应的基因名),还可以用purrr的imap函数更便捷地获取基因名:
library(purrr) # imap会同时传递数据框和它的名字(即基因名) imap(df_list, function(df, gene_name) { df %>% ggplot(aes(x = .data[[names(df)[4]]], y = .data[[names(df)[2]]])) + geom_boxplot() + ggtitle(gene_name) })
内容的提问来源于stack exchange,提问作者Helena
相关产品推荐
相关产品推荐

