r - 列名中的破折号产生 "object not found"错误

标签 r dataframe ggplot2 aesthetics

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

library(ggplot2)

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

哪里df数据框带列x , y ,然后是一堆基因名称。这适用于大多数基因名称;然而,有些有破折号并且这些失败:
print(plot_gene(df, "Gapdh")) # great!
print(plot_gene(df, "H2-Aa")) # Error: object "H2" not found

出现 gene变量正在解析( "H2-Aa" 变成 H2 - Aa )。我怎样才能解决这个问题?有没有办法表明一个字符串不应该通过 evalaes_string ?

可重复输入

如果你需要一些输入来玩,这会像我的数据一样失败:
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 会非常努力地确保 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插入
geom_point(aes_q(col = as.name(gene)))

最新发布ggplot支持通过 !! 转义而不是使用 aes_stringaes_q所以你可以这样做
geom_point(aes(col = !!rlang::sym(gene)))

关于r - 列名中的破折号产生 "object not found"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48651370/

相关文章:

r - `geom_abline` 和 `facet_wrap` 似乎不兼容

r - 将图例标签添加到 ggplot 的条形图

Java, rJava 安装在 AWS EC2 for R (xlsx and other packages)

python - 'DataFrame' 对象没有属性 'as_matrix

当有多个时,删除 ggplot2 中的额外图例

python - 如何使用 apply 两个 pandas 列(包括列表)来使用另一列中的元素返回一列列表中的索引?

python - 在 Pandas Dataframe 单元格中查找 [Python 列表] 的匹配值之和?

r - 更改轴标签中多条线之间的距离

javascript - R DT :datatable remove . 无页脚边框底部

正则表达式匹配所有可能性