索引數(shù)據(jù)框中的某一列
df$A可以索引數(shù)據(jù)框df中列名為A的列的所有值。那么假如列名是一個(gè)R對(duì)象怎么做?
df <- data.frame(A=1:5, B=(1:5)*2)df$A## [1] 1 2 3 4 5needed_column = 'A'# df$needed_column ? Wrong# 注意是雙方括號(hào)df[[needed_column]]## [1] 1 2 3 4 5
ggplot2繪圖中指定所需的列信息
ggplot繪圖時(shí),可以直接提供列名字(如下面的A和B分別指定為x軸和y軸)指定繪圖屬性,但如果列名字是一個(gè)R對(duì)象呢?這一情況常發(fā)生于自定義函數(shù)時(shí)。
library(ggplot2)ggplot(data=df, aes(x=A, y=B)) + geom_point()
如下:就需要使用sym和!!了,都來(lái)源于rlang包。
看新的例子中,xvariable=”A”;xvariable_en <- sym(xvariable)轉(zhuǎn)換為了symbol;aes(x=!!xvariable_en)等同于直接寫(xiě)aes(x=A)。兜兜轉(zhuǎn)轉(zhuǎn),2步轉(zhuǎn)換把想傳的值傳進(jìn)去了。
# 注意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和!!!,則可以轉(zhuǎn)換向量、列表對(duì)象。
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
寫(xiě)個(gè)公式 (formula)
公式 (formula)是一個(gè)在運(yùn)算和繪圖中常用的形式,直接寫(xiě)公式A~B可以,但如果是用對(duì)象構(gòu)造公式呢?
lm(A~B, data=df)## ## Call:## lm(formula = A ~ B, data = df)## ## Coefficients:## (Intercept) B ## 1.192e-15 5.000e-01
通過(guò)as.formula轉(zhuǎn)換
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
當(dāng)然下面這個(gè)“神奇”的寫(xiě)法也可以,整個(gè)表達(dá)式構(gòu)建一個(gè)字符串,再解析執(zhí)行出來(lái)。
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