一起来学R编程把—do.call 函数的应用

news2024/9/20 16:29:17

R语言由一个个基础函数组成,熟练灵活应用这些基础函数,有助于我们更好的学习R包及编程,这个专栏可能很多人不感兴趣,但是对提升自己很有帮助,感兴趣的朋友一起来学习。今天我们来介绍一下do.call函数的用法.
在这里插入图片描述
do.call函数是一个非常实用,而且强大灵活的函数,我们先看它的函数说明do.call根据一个名称或函数以及要传递给它的参数列表实用,构造并执行一个函数调用。
看到这个我们就可以明白do.call函数一般用在列表比较多,但是数据框也是可以应用的,它可以把名称或函数传给列表并执行,省去我们的繁琐过程下面我们来演示一下。 我们先生成一个数据

tmp <- expand.grid(letters[1:2], 1:3, c("+", "-"))
head(tmp)
##   Var1 Var2 Var3
## 1    a    1    +
## 2    b    1    +
## 3    a    2    +
## 4    b    2    +
## 5    a    3    +
## 6    b    3    +

我们使用一个paste函数可以把变量粘合在一起,在当前环境下,带不带引号都是一样的

do.call("paste", c(tmp, sep = ""))
##  [1] "a1+" "b1+" "a2+" "b2+" "a3+" "b3+" "a1-" "b1-" "a2-" "b2-" "a3-" "b3-"
do.call(paste, c(tmp, sep = ""))
##  [1] "a1+" "b1+" "a2+" "b2+" "a3+" "b3+" "a1-" "b1-" "a2-" "b2-" "a3-" "b3-"

也可以进行指定性粘合

a<-list(c("a","b","c"),c(c("1","2","3")))
do.call(paste, a, quote = TRUE)
## [1] "a 1" "b 2" "c 3"

假设有一个列表数据,我们想把它转成矩阵,使用do.call函数可以轻易做到

vectors <- list(c(1, 2, 3), c(4, 5, 6), c(7, 8, 9))
combined_matrix <- do.call(rbind, vectors)
combined_matrix
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9

使用do.call函数结合lapply函数,可以列表多个数据进行统计操作,我们先生成一个列表的数据

data_frames <- list(
  data.frame(a = 1:3), 
  data.frame(a = 4:6), 
  data.frame(a = 7:9)
)

在这里插入图片描述
进行多个数据均值计算

mean_results <- do.call(
  rbind, 
  lapply(data_frames, function(df) mean(df$a))
)
mean_results
##      [,1]
## [1,]    2
## [2,]    5
## [3,]    8

可以设定条件对列表的数据进行操作,vectors长度为2的时候数据间相加,等于3和时候相乘

vectors <- list(c(1, 2, 3), c(4, 5, 6))
if (length(vectors) == 2) {
  result <- do.call("+", vectors)
} else if (length(vectors) == 3) {
  result <- do.call("*", vectors)
}
result
## [1] 5 7 9

如果是不是列表数据,我们要对它进行操作,需要加个list

a<-c(1:5)
a
## [1] 1 2 3 4 5
do.call(mean, list(a))
## [1] 3

do.call函数中还有一个envir环境参数,如果你使用这个参数,表明你是从这个环境调用函数,使用的函数需要加上双引号。 假设当前的环境下的A和函数f

A <- 2
f <- function(x) print(x^2)

在一个新的环境下从新建立A和一个f

env <- new.env()
assign("A", 10, envir = env)
assign("f", f, envir = env)
f <- function(x) print(x)

我们先看一下新环境的A和f和当前是完全不同的,当前环境A=2,f=function(x) print(x),在新环境下,A=10,f=function(x) print(x^2)

env$A
## [1] 10
env$f
## function(x) print(x^2)

我们来运行下添加和不添加环境有什么不同

do.call("f", list(A))  
## [1] 2
do.call("f", list(A), envir = env)
## [1] 4
do.call( f,  list(A), envir = env) 
## [1] 2
do.call("f", list(quote(A)), envir = env) #
## [1] 100
do.call( f,  list(quote(A)), envir = env) # 10
## [1] 10
do.call("f", list(as.name("A")), envir = env) # 100
## [1] 100

可以看出添加envir = env,函数f加上引号后是不同的,f加上引号调用的是新环境的,不加引号还是调用当前环境的。A的话加用quote(A)或者as.name(“A”)就是调用新环境的,不加的话还是调用当前环境的A 对于这个规则call函数也是一样的

eval(call("f", A))                      # 2
## [1] 2
eval(call("f", quote(A)))               # 2
## [1] 2
eval(call("f", A), envir = env)         # 4
## [1] 4
eval(call("f", quote(A)), envir = env)  # 100
## [1] 100

还有写用法就是R包编程中为自己写好的函数进行数据分配,使用鸢尾花数据做例子,假设我已经写好一个绘图函数,想为自己的函数分配数据,我乱写一个

pf<-function(df) {
  x<-df$Sepal.Length;y<-df$Petal.Width
  plot(x,y,col="red")
}
pf
## function(df) {
##   x<-df$Sepal.Length;y<-df$Petal.Width
##   plot(x,y,col="red")
## }

我们把鸢尾花数据随便切割分配一下,分成3个数据,装在列表里面

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
iris.split <- split(iris,as.factor(iris$Species))

在这里插入图片描述
使用do.call批量绘图

do.call(rbind, lapply(iris.split, pf)
        )

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样多个数据的图片就绘制好了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/675976.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGLM-6B阿里云部署

机器配置 重点关注指标&#xff1a;CPU、内存、GPU、GPU驱动 类型CPU内存GPU机器配置16核125GNVIDIA A100 80G # 查看显卡安装状态 nvidia-smi 安装必要的软件 git sudo apt-get update sudo apt-get install git git-lfs(大文件管理) sudo apt-get install git-lfs py…

从零开始手搓一个STM32与机智云的小项目——GPIO模拟时序控制外设1

文章目录 前言WS2812B1.模块简介2.时序介绍3.硬件介绍4.传输速率&#xff0c;以及帧数要求 代码1.初始化2.模拟时序1.复位函数2.发送0、1码3.封装发送函数 总结 前言 上一篇文章中介绍了整个板子的最基本功能模块——使用GPIO的通用输入输出实现简单的按键输入以及推挽输出控制…

基于Java+Swing+Mysql实现图书管理系统V2.0

基于JavaSwingMysql实现图书管理系统V2.0 一、系统介绍二、功能展示1.项目内容2.项目骨架3.数据库表4.主界面5.添加6、修改7、查询8、删除 四、其它1.其他系统实现五.获取源码 一、系统介绍 本系统主要有对图书信息的增删改查操作功能。 项目类型&#xff1a;Java SE项目&…

到底还有谁学不会 MySQL 中的视图?

文章目录 MySQL中的视图视图的概念视图的用法简化查询操作提高查询效率保护数据的安全性 视图的代码示例总结 MySQL中的视图 在MySQL中&#xff0c;视图是一种虚拟表&#xff0c;它是由一个或多个基本表的行或列组成的。视图并不实际存储数据&#xff0c;而是根据定义的查询语…

6-端午练习

目录标题 6_221. 进程和线程2. 数据7>>1 6_231. 用户相关指令2. 创建用户(1. 查看id(2. 查看当前用户(3. 创建用户(4. 给新用户添加sudo权限>1 修改sudoers文件 2. 删除用户3. 修改用户名2. 磁盘1. 保证ubuntu链接上U盘(1. VM弹窗&#xff0c;选择链接到虚拟机(2. 虚拟…

DELL的交换机PowerSwitch学习手册-ONIE篇

下面是最近学习DELL的网络交换机PowerSwitch的一些笔记&#xff0c;供朋友们参考。如果还有问题&#xff0c;可以add wechat at StorageExpert。 在具体学习产品之前&#xff0c;先来了解下DELL的ONIE&#xff0c;什么是ONIE&#xff1f;和如何使用ONIE&#xff1f; ONIE是 O…

关于Nginx网站服务

目录 一、首先搭建Nginx服务 二、授权的访问控制 第一步 安装依赖包 第二步 生成用户密码认证文件 第三步 修改文件属性和权限 第四步 修改配置文件 第五步 用浏览器测试网站 三、基于IP地址进行限制 第一步 修改配置文件 第二步 用两台设备进行访问测试 四、基于域…

Linux - 内存、swap、内存回收机制

参考 2023年6月22日 https://zhuanlan.zhihu.com/p/107350459 —— 讨论的swap基于Linux4.4内核代码 内存深度科普: 从堆内存到虚拟内存管理 2023年6月22日 qbittorrent swap 问题 https://github.com/qbittorrent/qBittorrent/issues/12947 massif valgrind --toolmassif qb…

taro实现小程序地图打点

使用taro的map标签&#xff0c;往markers里放入点位&#xff1a; <map v-if"mapLoading" id"mapId":longitude"userPosition.x":latitude"userPosition.y":show-location"false":markers"markerList":scale&q…

Spring Boot 如何使用 JUL 进行日志记录

Spring Boot 如何使用 JUL 进行日志记录 在 Spring Boot 中&#xff0c;我们可以使用多种日志框架进行日志记录。其中&#xff0c;JUL (Java Util Logging) 是 Java 平台自带的日志框架&#xff0c;它提供了简单的 API 和配置&#xff0c;可以轻松地进行日志记录。本文将介绍如…

RocketMQ 常见面试题(一)

RocketMQ Broker 中的消息被消费后会立即删除吗&#xff1f; 不会&#xff0c;每条消息都会持久化到 CommitLog 中&#xff0c;每个 Consumer 连接到 Broker 后会维持消费进度信息&#xff0c;当有消息消费后只是当前Consumer 的消费进度&#xff08;CommitLog 的 offset&…

【计算机视觉】在计算机视觉里,传统卷积已经彻底输给Transformer了吗?

文章目录 一、传统卷积 & Transformer1.1 传统卷积1.2 Transformer 二、知乎高赞回答2.1 作者&#xff1a;知乎用户2.2 作者&#xff1a;王云鹤2.3 作者&#xff1a;知乎用户 一、传统卷积 & Transformer 1.1 传统卷积 传统卷积&#xff08;Traditional Convolution&…

【初识C语言(3)】选择语句+循环语句+函数+数组

文章目录 1. 选择语句2. 循环语句3. 函数4. 数组 C语言是一门结构化的程序设计语言 顺序结构&#xff1b; 选择结构&#xff1b; 循环结构。 1. 选择语句 生活中处处面临着选择&#xff0c;如果你好好学习&#xff0c;校招时拿一个好offer&#xff0c;走上人生巅峰。如果你不学…

案例突破——悲观锁和乐观锁

悲观锁和乐观锁 一、背景介绍二、悲观锁和乐观锁什么是悲观锁什么是乐观锁 三、 在项目中如何使用悲观锁和乐观锁在项目中使用悲观锁实体结构实体对象的xml配置文件对应生成的表结构往表中初始化数据运行之后的结果模拟触发悲观锁的条件核心代码 在项目中使用乐观锁实体结构(添…

【探索 Kubernetes|作业管理 Deployment 篇 系列 12】水平扩展 / 收缩、滚动 / 回滚更新

前言 大家好&#xff0c;我是秋意零。 在上一篇中&#xff0c;我们介绍了控制器的基本设计思想&#xff1a;控制器模式。通过这个 “控制器模式” 我们来看看 Deployment 是如何依靠它来实现的。 最近搞了一个扣扣群&#xff0c;旨在技术交流、博客互助&#xff0c;希望各位…

第40步 深度学习图像识别:DenseNet201建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;DenseNet201 DenseNet201是一种深度卷积神经网络&#xff0c;是DenseNet网络的一种变体。DenseNet&#xff0c;全称Dense Convolutional Network&#xff08;密集卷积网络&#xff09;&#xff0c;是由Faceb…

【VC 7/8】vCenter Server 更新(小版本升级)Ⅱ—— 使用 Shell 命令行更新 vCenter Server

目录 2. 使用 Shell 升级 vCenter Server&#xff08;1&#xff09;下载更新 ISO 镜像&#xff08;2&#xff09;挂载 ISO 镜像&#xff08;3&#xff09;验证 ISO 镜像已被挂载通过VAMI 更新界面将ISO 挂载到 VC 的文件系统 &#xff08;4&#xff09;更新 VC | 安装 vCenter …

Elasticsearch:如何通过 3 个简单步骤从 Elastic 数据中删除个人身份信息

作者&#xff1a;Peter Titov 对于任何组织来说&#xff0c;个人身份信息 (Personally Identifiable information, PII) 合规性都是一个日益严峻的挑战。 无论你是在电子商务、银行、医疗保健还是其他数据敏感的领域&#xff0c;PII 都可能会在无意中被捕获和存储。 拥有结构化…

丰田汽车投资人要求董事长下台

&#x1f699; 丰田电动车推广不力&#xff0c;股东要求董事长下台 Toyota faced down two proxy votes at its annual general meeting. In an unusual challenge to the management of a Japanese company, activist investors in America and Europe recommended voting aga…

跨境电商产品的评价怎么获取?

对于在亚马逊、沃尔玛、eBay、Wish、Newegg、速卖通、阿里国际站、Shopee、Lazada、Temu、乐天、Toktok、Joom、Ozon等跨境电商平台的卖家来说&#xff0c;产品评价和补单&#xff08;增加订单数&#xff09;是一个常见但至关重要的话题 优质的产品评价可以向潜在买家展示我们…