首页 > 解决方案 > 将列名作为变量传递/循环到 data.table 和 ggplot

问题描述

我经常遇到的一个问题data.tableggplot它们在 for 循环中的使用,在该循环中我迭代了一组列名。

以这张数据表为例:

dt <- data.table(values1=rep(c(1,2),each=2),
                 values2=rep(c(10,20),each=2),
                 notthis=0,
                 category=rep(c('a','b'),each=2))
##
##    values1 values2 notthis category
## 1:       1      10       0        a
## 2:       1      10       0        a
## 3:       2      20       0        b
## 4:       2      20       0        b

假设我想遍历dtexceptnotthis和的所有列category。对于每一列,我想根据 绘制其值的两个直方图category,并添加一条表示它们的平均值的垂直线(可能使用pdf, print,将图传递到 pdf 设备dev.off)。

代码的想法可能如下:

loopnames <- setdiff(colnames(dt), c('notthis', 'category'))
## [1] "values1" "values2"

for(ZZZ in loopnames){
    dtmeans <- dt[, .(means=mean(ZZZ)), by=category]

    ggplot(dt) + geom_histogram(aes(x=ZZZ, fill=category)) +
                 geom_vline(data=dtmeans, aes(xintercept=means, color=category))
}

但显然它不起作用。使用该ZZZ变量会在data.table和中产生错误ggplot

请注意某些代码行背后的原因:

参考这篇文章这篇文章这篇文章的有用答案,我尝试了各种组合来使上述代码想法起作用:with=FALSE用于数据表、quote()/eval()对、“取消引用”!!字符以及as.names()sym(). 但没有任何组合奏效。最接近解决问题的是quote()/eval()对,它似乎对data.table和都有效ggplot,但我没有设法在 for 循环中使用此解决方法。

您能否建议一种通用方法,而不使用 tidyverse 命令来处理包中的变量/循环列名,例如data.tableggplot

标签: rfor-loopggplot2data.table

解决方案


尝试get(ZZZ)在循环体中使用,而不是ZZZ


推荐阅读