索引数据框中的某一列
df$A可以索引数据框df中列名为A的列的所有值。那么假如列名是一个R对象怎么做?
df <- data.frame(A=1:5, B=(1:5)*2)df$A## [1] 1 2 3 4 5needed_column = 'A'# df$needed_column ? Wrong# 注意是双方括号df[[needed_column]]## [1] 1 2 3 4 5
ggplot2绘图中指定所需的列信息
ggplot绘图时,可以直接提供列名字(如下面的A和B分别指定为x轴和y轴)指定绘图属性,但如果列名字是一个R对象呢?这一情况常发生于自定义函数时。
library(ggplot2)ggplot(data=df, aes(x=A, y=B)) + geom_point()
如下:就需要使用sym和!!了,都来源于rlang包。
看新的例子中,xvariable=”A”;xvariable_en <- sym(xvariable)转换为了symbol;aes(x=!!xvariable_en)等同于直接写aes(x=A)。兜兜转转,2步转换把想传的值传进去了。
# 注意sym和!!的使用#ggplot_points <- function(data, xvariable, yvariable){ xvariable_en <- sym(xvariable) yvariable_en <- sym(yvariable) ggplot(data, aes(x=!!xvariable_en, y=!!yvariable_en)) + geom_point()}ggplot_points(df, "A", "B")
另外还有syms和!!!,则可以转换向量、列表对象。
library(dplyr)df %>% select(A,B)## A B## 1 1 2## 2 2 4## 3 3 6## 4 4 8## 5 5 10# 等同于columns <- c("A","B")columns_en % select(!!!columns_en)## A B## 1 1 2## 2 2 4## 3 3 6## 4 4 8## 5 5 10
写个公式 (formula)
公式 (formula)是一个在运算和绘图中常用的形式,直接写公式A~B可以,但如果是用对象构造公式呢?
lm(A~B, data=df)## ## Call:## lm(formula = A ~ B, data = df)## ## Coefficients:## (Intercept) B ## 1.192e-15 5.000e-01
通过as.formula转换
y = ‘A’z = ‘B’formula1 <- as.formula(paste(y,"~", z))lm(formula1, data=df)## ## Call:## lm(formula = formula1, data = df)## ## Coefficients:## (Intercept) B ## 1.192e-15 5.000e-01
当然下面这个“神奇”的写法也可以,整个表达式构建一个字符串,再解析执行出来。
eval(parse(text=paste(“lm(“, y, “~”, z, “, data=df)”)))## ## Call:## lm(formula = A ~ B, data = df)## ## Coefficients:## (Intercept) B ## 1.192e-15 5.000e-01