直接写和放在函数中不同的R语言用法

索引数据框中的某一列

df$A可以索引数据框df中列名为A的列的所有值。那么假如列名是一个R对象怎么做?

df <- data.frame(A=1:5, B=(1:5)*2)

df$A

## [1] 1 2 3 4 5

needed_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

相关推荐

  1. 直接函数不同R语言

    2024-06-07 12:50:04       7 阅读
  2. torch squeeze unsqueeze 不同

    2024-06-07 12:50:04       35 阅读
  3. C语言—scanfprintf 函数&字符

    2024-06-07 12:50:04       29 阅读
  4. usingtypenameC++

    2024-06-07 12:50:04       11 阅读
  5. MATLABcell函数

    2024-06-07 12:50:04       40 阅读
  6. ExcelINDIRECT函数

    2024-06-07 12:50:04       45 阅读
  7. pythonprint函数

    2024-06-07 12:50:04       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-07 12:50:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-07 12:50:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-07 12:50:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-07 12:50:04       20 阅读

热门阅读

  1. 人工智能安全综述

    2024-06-07 12:50:04       8 阅读
  2. anaconda pycharm jupter分别是

    2024-06-07 12:50:04       8 阅读
  3. 对于C++STL及其时间复杂度的总结

    2024-06-07 12:50:04       8 阅读
  4. w/o 讲解

    2024-06-07 12:50:04       7 阅读
  5. 240520Scala笔记

    2024-06-07 12:50:04       11 阅读
  6. Element-UI全面入门与实战技巧

    2024-06-07 12:50:04       9 阅读
  7. 【pytorch】数据转换/增强后保存

    2024-06-07 12:50:04       8 阅读
  8. Github 2024-06-07开源项目日报 Top10

    2024-06-07 12:50:04       10 阅读