r - 将列名作为变量传递/循环到 data.table 和 ggplot
问题描述
我经常遇到的一个问题data.table
是ggplot
它们在 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
假设我想遍历dt
exceptnotthis
和的所有列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
。
请注意某些代码行背后的原因:
- 我想构建一个由差异定义的列列表以进行迭代:
dt
可能有数百个列,我只想排除其中两个列。 - 我需要构建一个包含方法的数据表来传递给
geom_vline
(在我看来,这个数据表是矫枉过正的,但这就是ggplot
想要的)。 - 我想使用特殊的语法
data.table
来构造这样的数据表。
参考这篇文章、这篇文章和这篇文章的有用答案,我尝试了各种组合来使上述代码想法起作用:with=FALSE
用于数据表、quote()
/eval()
对、“取消引用”!!
字符以及as.names()
和sym()
. 但没有任何组合奏效。最接近解决问题的是quote()
/eval()
对,它似乎对data.table
和都有效ggplot
,但我没有设法在 for 循环中使用此解决方法。
您能否建议一种通用方法,而不使用 tidyverse 命令来处理包中的变量/循环列名,例如data.table
和ggplot
?
解决方案
尝试get(ZZZ)
在循环体中使用,而不是ZZZ
推荐阅读
- excel - APEX office print Plugin - 如何在模板中获取下载日期/创建日期
- java - Spring Boot 1.5.x 与 Java 11 的兼容性
- c - 探索 getchar() 函数
- java - Settings Activity Android 方法无法从静态内容中引用
- javascript - 如何为所有其他客户端移动特定客户端 div 他的鼠标位置
- php - 如何为路由创建中间件组
- python - 如何在单独的线程中实现阻塞监听功能,而main继续在Python中工作
- python - 使用 loc 的 Pandas 浮点值问题
- inheritance - Flutter:继承自抽象的无状态小部件
- laravel - Laravel 通知序列化问题