自定义函数 | R语言批量计算组间差值

news2024/10/5 14:04:47

批量字符替换、数值大小比较并重新赋值

  • cal_repeat()函数的实际操作
    • 1.不考虑处理变量。考虑多变量和指定2列变量的情况(长数据):
    • 2.考虑处理变量。考虑多处理,多变量的情况(长数据):
    • 3.考虑处理变量。考虑多处理,多变量的情况(宽数据):

   为了处理两列或者多列以及多变量重复样本间的组合差值,编了一个函数进行批量处理。今天与大家分享 DailyTools包中我编写的一个 cal_repeat函数。

为了实现2列变量重复样本的组合差值计算,如图所示:
在这里插入图片描述
这是y的三个重复值与x的三个重复值组合做差,得出9个新的差值。如何使用R代码?R代码的实现过程:

x <- 1:3 
y <- 5:7
data <- data.frame(x, y)
result <- as.data.frame(outer(y, x, FUN = "-"))
result
#   V1 V2 V3
# 1  4  3  2
# 2  5  4  3
# 3  6  5  4

然而,实际情况下,数据集中可能存在实验处理甚至很多个,也可能不只一个目标变量,分组变量也不仅只有2个(也就是x和y可能还有更多需要相互进行组合运算的变量),如下图:‘’
在这里插入图片描述
对于上述的数据类型仅依赖outer函数想完成对应的计算也很复杂和麻烦,用excel所需时间更漫长。因此,写了一个函数来解决这个这个问题,从而实现多处理多变量下重复样本间的组合计算(可以做差值、比值及其他运算法则)。

在这里插入图片描述
介绍完outer函数,回到今天的主题,我们先从github平台下载一下DailyTools包。

# install.packages("devtools")
# install.packages("remotes")
devtools::install_github("Jylande/DailyTools")
remotes::install_github("Jylande/DailyTools",force = TRUE)

在这里插入图片描述
成功下载后,并加载R包:

library(DailyTools)

然后看看对应函数的介绍:
?cal_repeat
在这里插入图片描述
从介绍中可以看到函数主要用途。具体用法如下:

cal_repeat (data, y = NULL, x = NULL, treat_reserve = NULL, multi_vars = NULL, class_name = NULL, var_name = NULL, FUN = “-”)

从函数用法看,多个参数为NULL,都是交互式的,可以根据自己数据集的情况来做对应改写。

对应参数的介绍如下:
在这里插入图片描述
个人详细解读:

  • data: 数据为数据框结构,可以是长数据或者宽数据。
  • y: 该参数为指定2列需要做组合运算中主动的那列变量,默认不指定。
  • x: 该参数为指定2列需要做组合运算中的另外一列变量(被动),默认不指定。
  • treat_reserve: 若数据集中存在处理变量需要考虑,则指定这个参数。例如treat_reserve = c(“A”, “B”),"A"和"B"为数据集中两个处理变量,最多不超过5个处理变量(通常实验处理最多3个)。该参数设定后就可以考虑处理变量所构成分类组合的所有子集,这样就考虑所有处理组合的子集情况。如果默认则不考虑处理变量。
  • multi_vars: 数据是长数据时,该参数表明数据集中所需要计算的目标变量,如前三列为处理变量,另外一列是class_name,而第5到第10列均为目标变量,则可用multi_vars = 5:10 表示所有变量均考虑计算。数据为宽数据时,该参数的选择并不是目标变量,而是选择进行组合运算的变量数。比如例子中,X2001与X2005之间的5列变量均要考虑组合运算。
  • class_name: 这个参数仅在数据集是长数据时设定。设定对应所需要进行做差的分类变量,比如例子中主要计算"Var6"该变量中分类的组合差值,因此该参数在长数据集必须指定。而宽数据不需要使用该参数,因为宽数据以某个分类处理后的数据,已经完成了长数据转换成宽数据这一步骤。
  • var_name: 如果设定该参数,表明想指定的目标变量是单一变量,具体是某一个。在例子中,如我设定var_name = “A”, 表明在多个变量中,我只计算A这个变量,其他变量不考虑。当数据为长数据时,multi_vars参数与该参数所表达的内容相似(multi_vars可以选择多变量),因此两者不能同时存在。
  • FUN: 该参数与outer函数中FUN相同,这里主要是加减乘除四则运算,其他的一些运算可以参考outer函数中FUN参数使用。

cal_repeat()函数的实际操作

考虑到Examples内容非常详细。这里介绍几类典型且可能较为常用的例子:

# Trial data sets (Refer to the data structure of the example)
# long data
treat1 <- c("YES", "NO")
treat2 <- c("A", "B", "C")
treat3 <- c("a", "b", "c")
treat4 <- c("e", "f", "g")
treat5 <- c("D", "E")
class <- 2001:2005
vars_long <- expand.grid(treat1, treat2, treat3, treat4, treat5, class, stringsAsFactors = FALSE)

set.seed(1)
data_long <- data.frame(vars_long,
                    A = rnorm(n = nrow(vars_long), mean = 450, sd = 35),
                    B = rnorm(n = nrow(vars_long), mean = 100, sd = 5),
                    C = rnorm(n = nrow(vars_long), mean = 50, sd = 2)); data_long

 
# wide data
vars_wide <- expand.grid(treat1, treat2, treat3, treat4, treat5)
vars <-  rep(rep(LETTERS[1:3], each = 3), nrow(vars_wide))

set.seed(1)
data_wide <- data.frame(vars, vars_wide,  
                    "2001" = rnorm(length(vars), mean = 100, sd = 10),
                    "2002" = rnorm(length(vars), mean = 200, sd = 10),
                    "2003" = rnorm(length(vars), mean = 300, sd = 10),
                    "2004" = rnorm(length(vars), mean = 400, sd = 10),
                    "2005" = rnorm(length(vars), mean = 500, sd = 10)); data_wide
                     

#1 For long data, consider multiple variables
result1 <- cal_repeat(data = data_long, multi_vars = 7:9, treat_reserve = NULL, 
                   class_name = "Var6", var_name = NULL, y = NULL, x = NULL,
                   FUN = "-"); result1

result1.1 <- cal_repeat(data = data_long, multi_vars = 7:8, treat_reserve = NULL, 
                     class_name = "Var6", var_name = NULL, y = NULL, x = NULL,
                     FUN = "-"); result1.1


#1.2 Specify a single variable
result2 <- cal_repeat(data = data_long, y = NULL, x = NULL, multi_vars = NULL, 
                      class_name = "Var6", treat_reserve = NULL, 
                      var_name = "B", FUN = "-"); result2

result2.1 <- cal_repeat(data = data_long, y = NULL, x = NULL, multi_vars = NULL, 
                        class_name = "Var6", treat_reserve = NULL, 
                        var_name = "A", FUN = "-"); result2.1


#1.3 Specify a single variable and specify x and y
result3 <- cal_repeat(data = data_long, y = "2005", x = "2001", multi_vars = NULL, 
                      class_name = "Var6", treat_reserve = NULL,  
                      var_name = "B", FUN = "-"); result3


#1.4 Specify other categorical variable names
result4 <- cal_repeat(data = data_long, y = "E", x = "D", multi_vars = NULL,
                      class_name = "Var5", treat_reserve = NULL, 
                      var_name = "B", FUN = "-"); result4
 
result4.1 <- cal_repeat(data = data_long, class_name = "Var5", multi_vars = NULL,
                        treat_reserve = NULL, y = NULL, x = NULL,
                        var_name = "B", FUN = "-"); result4.1
 
result4.2 <- cal_repeat(data = data_long, multi_vars = 7:8, var_name = NULL, 
                        treat_reserve = NULL, y = NULL, x = NULL,
                        class_name = "Var5", FUN = "-"); result4.2
 
 
#2.1 For wide data, consider multiple variables
result5 <- cal_repeat(data = data_wide, y = NULL, x = NULL, multi_vars = 7:9, 
                      treat_reserve = NULL, class_name = NULL, var_name = NULL, 
                      FUN = "-"); result5
                      
result5.1 <- cal_repeat(data = data_wide, y = NULL, x = NULL, multi_vars = 7:9, 
                        treat_reserve = NULL, class_name = NULL, var_name = "A", 
                        FUN = "-"); result5.1
 
#2.2 Specify x and y
result6 <- cal_repeat(data = data_wide, y = "X2002", x = "X2001", multi_vars = NULL, 
                      treat_reserve = NULL, class_name = NULL, var_name = NULL, 
                      FUN = "-"); result6
                      
result6.1 <- cal_repeat(data = data_wide, y = "X2002", x = "X2001", multi_vars = NULL, 
                      treat_reserve = NULL, class_name = NULL, var_name = "A", 
                      FUN = "-"); result6.1
                      
                        
#3.1 More control variables
# for long data
result7 <- cal_repeat(data = data_long, y = NULL, x = NULL, 
                      treat_reserve = c("Var1", "Var2"), var_name = NULL,
                      multi_vars = 7:8, class_name = "Var6", 
                      FUN = "-"); result7

result7.1 <- cal_repeat(data = data_long, y = NULL, x = NULL, 
                      treat_reserve = c("Var1", "Var2", "Var3"), var_name = NULL,
                      multi_vars = 7:8, class_name = "Var6", 
                      FUN = "-"); result7.1     
                      
result7.2 <- cal_repeat(data = data_long, y = "2002", x = "2001", 
                      treat_reserve = c("Var1", "Var2", "Var3"), var_name = NULL,
                      multi_vars = NULL, class_name = "Var6", 
                      FUN = "-"); result7.2   
                                                                                                                      
result7.3 <- cal_repeat(data = data_long, y = "2002", x = "2001", 
                       treat_reserve = c("Var1", "Var2", "Var3", "Var4", "Var5"),
                       var_name = NULL, multi_vars = NULL, class_name = "Var6", 
                       FUN = "-"); result7.3                         
                   
# for wide data
result8 <- cal_repeat(data = data_wide,  y = NULL, x = NULL,
                       treat_reserve = c("Var1", "Var2"), 
                       multi_vars = 7:9, class_name = NULL, var_name = NULL,
                       FUN = "-"); result8

result8.1 <- cal_repeat(data = data_wide,  y = "X2002", x = "X2001",
                       treat_reserve = c("Var1", "Var2", "Var3"), 
                       multi_vars = NULL, class_name = NULL, var_name = NULL,
                       FUN = "-"); result8.1


#4.1 Other calculation methods (such as division)
result9 <- cal_repeat(data = data_long, multi_vars = 7:8, treat_reserve = NULL, 
                       class_name = "Var6", var_name = NULL, y = NULL, x = NULL,
                       FUN = "/"); result9                                        

1.不考虑处理变量。考虑多变量和指定2列变量的情况(长数据):

数据如下,需要计算Var6这列变量中分类的组合运算(差值):
在这里插入图片描述
代码如下:我们考虑A-C三个变量,对应的是数据集中的7到9列,因此multi_vars = 7:9,class_name = “Var6”。

result1.1 <- cal_repeat(data = data_long, multi_vars = 7:9, 
treat_reserve = NULL, class_name = "Var6", var_name = NULL, 
y = NULL, x = NULL, FUN = "-"); result1.1

结果如下:
在这里插入图片描述
从结果来看,一共有接近35W行的数据,可想而知如果这个计算量在excel来处理得处理多久,另外还可能出错。使用这个函数只需要十秒左右就能得到结果。
在这里插入图片描述
可以看到,Var6所有情况都考虑了,目标变量ABC也都计算了。
在这里插入图片描述
如果指定y和x,对应的代码写法如下:

result1.2 <- cal_repeat(data = data_long, y = "2005", x = "2001",
multi_vars = 7:9, class_name = "Var6", treat_reserve = NULL, 
var_name = NULL, FUN = "-"); result1.2

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
只考虑一个目标变量,并且指定x和y:

result1.3 <- cal_repeat(data = data_long, y = "2005", x = "2001",
multi_vars = NULL, class_name = "Var6", treat_reserve = NULL,
var_name = "A", FUN = "-"); result1.3

在这里插入图片描述

2.考虑处理变量。考虑多处理,多变量的情况(长数据):

数据如下,需要计算Var6这列变量中分类的组合运算(差值):
在这里插入图片描述
比如我们要考虑Var1-3共三个处理变量,treat_reserve 设定好即可。这里,目标变量我们只选择了7:8。

result2.1 <- cal_repeat(data = data_long, y = NULL, x = NULL,
treat_reserve = c("Var1", "Var2", "Var3"),
var_name = NULL, multi_vars = 7:8,
class_name = "Var6", FUN = "-"); result2.1

在这里插入图片描述
在这里插入图片描述

3.考虑处理变量。考虑多处理,多变量的情况(宽数据):

数据如下(差值)数据X2001-X2005应该是你所需要组合运算的变量分类:
在这里插入图片描述
这里需要注意的是,当你的数据是宽数据时,你的目标变量的列名改为vars, 然后按行排列叠加。
在这里插入图片描述

result3.1 <- cal_repeat(data = data_wide, y = NULL, x = NULL,
           treat_reserve = c("Var1", "Var2", "Var3"),
           multi_vars = 7:9, class_name = NULL, var_name = NULL,
                        FUN = "-"); result3.1

在宽数据中进行运算时,multi_vars这个参数表明你要保留的分类变量,比如只打算计算X2001-X2003之间的组合比较,即7:9。如果要考虑X2001-X2005,则7:11。结果如下:
在这里插入图片描述
在这里插入图片描述
经过参数介绍,大家应该在使用时也可以分清楚参数的差异,有问题请留言~

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

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

相关文章

Node【Global全局对象】

文章目录 &#x1f31f;前言&#x1f31f;Global全局对象&#x1f31f;Global对象属性与方法&#x1f31f;Global对象属性&#x1f31f;process&#x1f31f;Buffer类&#x1f31f;console &#x1f31f;写在最后 &#x1f31f;前言 哈喽小伙伴们&#xff0c;新的专栏 Node 已…

华为OD机试真题(Java),最优策略组合下的总的系统消耗资源数(100%通过+复盘思路)

一、题目描述 在通信系统中有一个常见的问题是对用户进行不同策略的调度&#xff0c;会得到不同系统消耗的性能。 假设由N个待串行用户&#xff0c;每个用户可以使用A/B/C三种不同的调度策略&#xff0c;不同的策略会消耗不同的系统资源。 请你根据如下规则进行用户调度&…

netty源码阅读--服务启动

背景 netty是一个非常成熟的NIO框架&#xff0c;众多apache的顶级项目底层通信框架都是用的是netty,本系列博客主要是记录自己复习netty源码的过程&#xff0c;重在理解netty的关键如&#xff1a;如何启动&#xff0c;如何接受网络数据、netty的内存管理机制以及编解码器等&am…

【KingSCADA】如何建立硬件系统及相关变量

小伙伴们大家好&#xff0c;我是雷工&#xff01; 本篇学习了解KingSCADA3.8如何建立硬件系统及相关变量&#xff0c;以下为学习过程和操作记录。 一、前言 本篇主要讲解如何定义设备&#xff0c;如何定义变量。 KingSCADA3.8的采集系统是指负责和现场设备进行通讯&#xff0…

通过azure学生认证拿到一年服务器使用权

通过azure学生认证 因为国内备案被迫找其他服务器 开始我买了一个华为的服务器&#xff0c;大家都知道&#xff0c;在国内&#xff0c;服务器是需要备案的。如果你备案过的话&#xff0c;就知道这个是非常麻烦的事情。时间久不说。过程也是非常的繁琐。这个繁琐的过程&#x…

《Linux基础》06. 进程管理 · 服务管理

Linux基础-06 1&#xff1a;进程管理1.1&#xff1a;查看进程1.1.1&#xff1a;ps1.1.2&#xff1a;pstree1.1.3&#xff1a;top 1.2&#xff1a;终止进程1.2.1&#xff1a;kill1.2.2&#xff1a;killall 2&#xff1a;服务管理2.1&#xff1a;运行级别2.2&#xff1a;服务查看…

每日一练2023.4.17-2023.4.18

数轴上的bfs 农夫约翰被通知&#xff0c;他的一只奶牛逃逸了&#xff01;所以他决定&#xff0c;马上出发&#xff0c;尽快把那只奶牛抓回来&#xff0e; 他们都站在数轴上&#xff0e;约翰在N(0≤N≤100000)处&#xff0c;奶牛在K(0≤K≤100000)处&#xff0e;约翰有 两种办…

门控循环神经网络学习笔记

在介绍门控循环神经网络之前&#xff0c;先简单介绍循环神经网络的基本计算方式&#xff1a; 循环神经网络之称之为“循环”&#xff0c;因为其隐藏状态是循环利用的&#xff1a; 上一次输入计算出的隐藏状态与当前的输入结合&#xff0c;得到当前隐藏状态。 cur_output, cur…

【嵌入式笔/面试】嵌入式软件基础题和真题总结——操作系统

在学习的时候找到几个十分好的工程和个人博客&#xff0c;先码一下&#xff0c;内容都摘自其中&#xff0c;有些重难点做了补充&#xff01; 才鲸 / 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linux 嵌入式软件面试合集 2022年春招实习十四面…

电脑丢失的dll文件怎么一键修复?修复dll方法分享

电脑丢失的dll文件怎么一键修复&#xff1f;电脑状况常常让人遇到各种问题&#xff0c;其中“DLL文件丢失”是最常见的问题之一。在这篇文章中&#xff0c;我们会介绍为何会出现DLL文件丢失的问题&#xff0c;以及提供一种简单、快捷的DLL文件修复方法。 一.为何会出现DLL文件丢…

vue使用vue-mapvgl实现烟台市各区县行政区绘制、三维柱状图

一、效果展示 二、地图组件&#xff1a; vue-mapvgl https://docs.guyixi.cn/vue-mapvgl/#/ 三、代码 main.js //vue-mapvGL import VueBMap from vue-bmap-gl; import vue-bmap-gl/dist/style.css import VueMapvgl from vue-mapvgl; Vue.use(VueBMap); Vue.use(VueMapvg…

c++算法——算法章节-时间空间复杂度

算法开章咯 这次是csp-j组算法 枚举法常用排序合集hash一维前缀和vector结构体queuestack贪心-简单贪心区间递归二分setmap二叉树图的遍历-邻接矩阵迷宫问题-dfs-深度优先搜素bfs-广度优先搜索动态规划-简单动态规划-01背包动态规划-背包-多重背包二分答案 算法是什么嘛&…

腾讯云轻量4核8G12M应用服务器带宽、月流量详细性能评测

腾讯云轻量4核8G12M应用服务器带宽&#xff0c;12M公网带宽下载速度峰值可达1536KB/秒&#xff0c;折合1.5M/s&#xff0c;每月2000GB月流量&#xff0c;折合每天66GB&#xff0c;系统盘为180GB SSD盘&#xff0c;地域节点可选上海、广州或北京&#xff0c;4核8G服务器网来详细…

0基础同学如何快速入门学Python

转自&#xff1a;https://www.zhihu.com/question/596253606/answer/2994169972 想学Python的小伙伴&#xff0c;这里给你们汇总了&#xff1a;学习资源、平台、小白环境配置、相关课程、书籍资料&#xff01;并且&#xff0c;附送学习方法以及计划制定。 一、可以了解到Pyth…

Appuploader证书申请教程

转载&#xff1a;IOS证书制作教程 点击苹果证书 按钮 点击新增 输入证书密码&#xff0c;名称 这个密码不是账号密码&#xff0c;而是一个保护证书的密码&#xff0c;是p12文件的密码&#xff0c;此密码设置后没有其他地方可以找到&#xff0c;忘记了只能删除证书重新制作&…

还在精神内耗?还在焦虑?可以看看这个

作为一个即将毕业的本科生&#xff0c;总是会不由自主的焦虑。因为不考研&#xff0c;所以显得和同学们格格不入&#xff0c;每天都在进行精神内耗&#xff0c;但是我不经意间看到了一个东西-《邓宁克鲁格效应》 上述的四个阶段刻画出了一条典型的“大师养成之路”。但大师毕竟…

华为三层交换机命令集合,已经分好类了,网工建议收藏!

你好&#xff0c;这里是网络技术联盟站。 本文给大家带来的是华为三层交换机的命令集合&#xff0c;我已经分好类&#xff0c;大家可以收藏备用&#xff01; 一、系统管理命令 1.1 查看版本信息 display version此命令用于查看交换机的版本信息&#xff0c;包括交换机的软件…

【AI理论学习】深入理解Prompt Learning和Prompt Tuning

深入理解Prompt Learning和Prompt Tuning 背景Prompt Learning简介1. Prompt是什么&#xff1f;2. 为什么要使用Prompt&#xff1f;3. Prompt Learning的形式&#xff08;举例&#xff09;4. 有哪些Pre-training language model&#xff1f;5. 常见的Prompt Learning的方法 Pro…

WebRTC 源码分析——Android 视频硬件编码

作者&#xff1a;DevYK 1. 简介 本文将重点介绍在 Android 平台上&#xff0c;WebRTC 是如何使用 MediaCodec 对视频数据进行编码&#xff0c;以及在整个编码过程中 webrtc native 与 java 的流程交互。 本篇开始会先回顾一下 Andorid MediaCodec 的概念和基础使用&#xff0…

Node【Global全局对象】之【Process】

文章目录 &#x1f31f;前言&#x1f31f;Process&#x1f31f;process属性&#x1f31f;process.env &#x1f31f;process方法&#x1f31f;process事件&#x1f31f;uncaughtException &#x1f31f;写在最后 &#x1f31f;前言 哈喽小伙伴们&#xff0c;新的专栏 Node 已开…