我有一个脚本,允许用户通过在控制台上输入列名前缀来选择要处理的列。下面的第一个示例显示了一个典型的操作:计算分数的出现次数。输入表具有两列:类别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()
一起工作的方式,也许有些奇怪吗?还是报价有问题?
在此先感谢您的帮助!