如何在 ggplot 函数中使用以数字开头的列名

jkh*_*huc 2 r escaping function ggplot2

我有一个巨大的数据框,其变量/列名称以数字开头,例如“1_variable”。现在我正在尝试创建一个函数,该函数可以将这些列名称作为参数,然后使用 ggplot 绘制一些箱线图。但是,我需要该字符串,但还需要将其输入与 `` 一起使用,以使用 ggplot 中的参数。但是我不确定如何转义“1_variable”等字符串,以便为 ggplot 提供“1_variable”输入。

可重复的小例子:

dfx = data.frame(`1ev`=c(rep(1,5), rep(2,5)), `2ev`=sample(10:99, 10), 
             `3ev`=10:1, check.names = FALSE)
Run Code Online (Sandbox Code Playgroud)

如果我手动绘制该图,输入将如下所示:

 dfx$`1ev` <- as.factor(dfx$`1ev`)
 ggplot(dfx, aes(x = `1ev`, y = `2ev`))+
   geom_boxplot()
Run Code Online (Sandbox Code Playgroud)

我希望能够为数据帧运行的函数是这样的:

plot_boxplot <- function(data, group, value){
    data = data[c(group, value)]
    data[,group] = as.factor(data[,group])
    plot <- ggplot(data, aes(x = group, y = value))+
    geom_boxplot() 
    return(plot)
}
Run Code Online (Sandbox Code Playgroud)

1. 尝试

plot_boxplot(dfx, `1ev`, `2ev`)
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误说Error in [.data.frame(data, c(group, value)) : object '1ev' not found

2. 尝试

用双引号 "" 输入参数给了我意想不到的结果:

plot_boxplot(dfx, "1ev", "2ev")
Run Code Online (Sandbox Code Playgroud)

意外的输出

3.尝试gsub我还尝试将函数中 字符串的双引号替换为

gsub('\"', '`', group)
Run Code Online (Sandbox Code Playgroud)

但这不会改变其输出的任何内容。

4. 尝试

最后,我也尝试使用aes_string,但这只会给我带来同样的错误。

plot_boxplot <- function(data, group, value){
   data = data[c(as.character(group), as.character(value))]
   data[,group] = as.factor(data[,group])
   plot <- ggplot(data, aes_string(x= group, y=value))+
     geom_boxplot() 
   return(plot)    
}

plot_boxplot(dfx, `1ev`, `2ev`)

plot_boxplot(dfx, "1ev", "2ev")
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想运行该函数来产生以下输出:

plot_boxplot(dfx, group = "1ev", value = "2ev")
Run Code Online (Sandbox Code Playgroud)

预期产出

[可以用此代码手动生成]

ggplot(dfx, aes(x= `1ev`, y=`2ev`)) +
  geom_boxplot() 
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激。

Nat*_*ate 5

一种方法是结合使用aes_as.name()

plot_boxplot <- function(data, group, value){
    data = data[c(group, value)]
    data[,group] = as.factor(data[,group])

    plot <- ggplot(data, aes_(x= as.name(group), y=as.name(value))) +
      geom_boxplot()

    return(plot)
}
Run Code Online (Sandbox Code Playgroud)

group并为and传递字符串value

plot_boxplot(dfx, "1ev", "2ev")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这与上面显示的图表不同,但它看起来与数据一致。