【问题标题】:Dash in column name yields "object not found" Error列名中的破折号产生“找不到对象”错误
【发布时间】:2018-02-06 20:24:13
【问题描述】:

我有一个函数可以从数据中生成散点图,其中提供了一个参数来选择用于为点着色的列。这是一个简化的版本:

library(ggplot2)

plot_gene <- function (df, gene) {
   ggplot(df, aes(x, y)) + 
     geom_point(aes_string(col = gene)) +
     scale_color_gradient()
}

其中df 是一个data.frame,其中包含xy 列,然后是一堆基因名称。这适用于大多数基因名称;但是,有些有破折号,这些破折号:

print(plot_gene(df, "Gapdh")) # great!
print(plot_gene(df, "H2-Aa")) # Error: object "H2" not found

似乎gene 变量正在被解析("H2-Aa" 变为H2 - Aa)。我怎样才能解决这个问题?有没有办法在aes_string中指明字符串不应该经过eval

可重复输入

如果你需要一些输入来玩,这会像我的数据一样失败:

df <- data.frame(c(1,2), c(2,1), c(1,2), c(2,1))
colnames(df) <- c("x", "y", "Gapdh", "H2-Aa")

对于我的真实数据,我使用read.table(..., header=TRUE) 并获取带有破折号的列名,因为原始数据文件有它们。

【问题讨论】:

    标签: r dataframe ggplot2 aesthetics


    【解决方案1】:

    通常,R 会非常努力地确保 data.frame 中的列名可以是有效的变量名。在使用使用非标准评估类型语法的函数时,使用非标准列名(那些不是有效的变量名)会导致问题。当专注于使用此类变量名称时,您通常必须将它们包装在反引号中。一般情况下

    ggplot(df, aes(x, y)) + 
      geom_point(aes(col = H2-Aa)) +
      scale_color_gradient()
    # Error in FUN(X[[i]], ...) : object 'H2' not found
    

    会返回错误但是

    ggplot(df, aes(x, y)) + 
      geom_point(aes(col = `H2-Aa`)) +
      scale_color_gradient()
    

    会起作用的。

    如果你真的想要,你可以粘贴反引号

    geom_point(aes_string(col = paste0("`", gene, "`")))
    

    或者您可以从一开始就将其视为一个符号并使用aes_q instread

    geom_point(aes_q(col = as.name(gene)))
    

    ggplot 的最新版本支持通过!! 转义,而不是使用aes_stringaes_q,所以你可以这样做

    geom_point(aes(col = !!rlang::sym(gene)))
    

    【讨论】:

    • 即使像colnames(test) &lt;- c("x", "y", "z", "H2 - O") 这样的命令也允许设置非标准的列名。很高兴了解as.name
    • 当然,您可以将它们设置为您想要的任何值,但是当通过read.table 导入数据时,会正确重命名(除非您禁用它)。应该仔细考虑非标准列名是否真的值得所有额外的麻烦。
    • 我确实使用了read.table,除了header = TRUE之外没有其他参数。它没有按照您的建议清除我的列名。
    • 哇。我觉得非常令人惊讶。您确定您没有设置check.names = FALSE 或以其他方式重命名它们吗?如果我运行read.table(text="a-b,c\n1,2", header=T, sep=","),我会看到- 变成了.
    • 这是我导入数据时所做的:nspCounts &lt;- do.call(cbind, lapply(naiveSpleenFiles, function(x) { read.table(gzfile(x), header=TRUE) })) 其中naiveSpleenFiles 是要导入的压缩文件的向量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2018-07-12
    • 1970-01-01
    • 2018-11-03
    • 2014-05-14
    • 2016-09-10
    • 2012-08-31
    相关资源
    最近更新 更多