索引數據框中的某一列
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包。
1、sym把一個R字符串對象轉換為一個symbol。
2、(bang-bang操作符)!!則把symbol再轉回R字符串對象,等同于直接寫這個對象。
看新的例子中,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 <- syms(columns)
df %>% 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
P1 R基本語法和使用方式01
P2 R基本語法和使用方式02