强制R将字符串评估为列名

时间:2019-06-14 21:54:49

标签: r evaluation

我有一个脚本,允许用户通过在控制台上输入列名前缀来选择要处理的列。下面的第一个示例显示了一个典型的操作:计算分数的出现次数。输入表具有两列:类别cat和得分ANT_tot。输入由dplyr::count处理,并生成包含两列的输出表:得分值ANT_tot和每个值n的出现次数。

library(tidyverse)
df1 <- data.frame(cat = c(1,1,2,2,2,3,3,3,3,3), 
                  ANT_tot = c(45,72,51,51,51,45,30,31,30,31))
df2 <- df1 %>% count(ANT_tot)
df2

# A tibble: 5 x 2
  ANT_tot     n
    <dbl> <int>
1      30     2
2      31     2
3      45     2
4      51     3
5      72     1

在实际脚本中,用户通过键入前缀来标识要处理的列,并且该前缀已分配给char vec。在此示例中,我将省略控制台输入步骤,仅初始化向量score_name

score_name <- c('ANT')

此字符串ANT通过与不同的后缀一起粘贴以命名各列而在整个脚本中使用。

在其他应用程序中,我成功使用eval()as.name()强制R将粘贴在一起的字符串作为列名来对待,例如

eval(as.name(paste0(score_name, '_tot')))

在其他情况下,表达式的计算结果为列名ANT_tot,R可以将其作为变量处理。

但是,它在我上面提供的dplyr::count示例中创建了有问题的输出:

df3 <- df1 %>% count(eval(as.name(paste0(score_name, '_tot'))))
df3

# A tibble: 5 x 2
  `eval(as.name(paste0(score_name, "_tot")))`     n
                                        <dbl> <int>
1                                          30     2
2                                          31     2
3                                          45     2
4                                          51     3
5                                          72     1

它不是简单地传递预先存在的列名ANT_tot,而是使用整个eval()表达式重命名该列,从而在后续处理工作中抛出了一个扳手。

我为为什么会这样而感到困惑,因为当在其他函数(例如mean())中使用相同的表达式时,会产生预期的结果。

关于评估与count()一起工作的方式,也许有些奇怪吗?还是报价有问题?

在此先感谢您的帮助!

0 个答案:

没有答案