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

这篇具有很好参考价值的文章主要介绍了自定义函数 | R语言批量计算组间差值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


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

为了实现2列变量重复样本的组合差值计算,如图所示:
自定义函数 | R语言批量计算组间差值
这是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可能还有更多需要相互进行组合运算的变量),如下图:‘’
自定义函数 | R语言批量计算组间差值
对于上述的数据类型仅依赖outer函数想完成对应的计算也很复杂和麻烦,用excel所需时间更漫长。因此,写了一个函数来解决这个这个问题,从而实现多处理多变量下重复样本间的组合计算(可以做差值、比值及其他运算法则)。

自定义函数 | R语言批量计算组间差值
介绍完outer函数,回到今天的主题,我们先从github平台下载一下DailyTools包。

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

自定义函数 | R语言批量计算组间差值
成功下载后,并加载R包:

library(DailyTools)

然后看看对应函数的介绍:
?cal_repeat
自定义函数 | R语言批量计算组间差值
从介绍中可以看到函数主要用途。具体用法如下:

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

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

对应参数的介绍如下:
自定义函数 | R语言批量计算组间差值
个人详细解读:

  • 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这列变量中分类的组合运算(差值):
自定义函数 | R语言批量计算组间差值
代码如下:我们考虑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

结果如下:
自定义函数 | R语言批量计算组间差值
从结果来看,一共有接近35W行的数据,可想而知如果这个计算量在excel来处理得处理多久,另外还可能出错。使用这个函数只需要十秒左右就能得到结果。
自定义函数 | R语言批量计算组间差值
可以看到,Var6所有情况都考虑了,目标变量ABC也都计算了。
自定义函数 | R语言批量计算组间差值
如果指定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

自定义函数 | R语言批量计算组间差值
自定义函数 | R语言批量计算组间差值
自定义函数 | R语言批量计算组间差值
只考虑一个目标变量,并且指定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

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

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

数据如下,需要计算Var6这列变量中分类的组合运算(差值):
自定义函数 | R语言批量计算组间差值
比如我们要考虑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

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

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

数据如下(差值)数据X2001-X2005应该是你所需要组合运算的变量分类:
自定义函数 | R语言批量计算组间差值
这里需要注意的是,当你的数据是宽数据时,你的目标变量的列名改为vars, 然后按行排列叠加。
自定义函数 | R语言批量计算组间差值

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。结果如下:
自定义函数 | R语言批量计算组间差值
自定义函数 | R语言批量计算组间差值
经过参数介绍,大家应该在使用时也可以分清楚参数的差异,有问题请留言~文章来源地址https://www.toymoban.com/news/detail-421058.html

到了这里,关于自定义函数 | R语言批量计算组间差值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】函数的定义及调用

            刚刚结束了数组的介绍,有需要的猿友可以去看我之前的文章,从这篇文章开始,进行函数相关的介绍,代码均来自VS编译环境下。 目录 一、定义函数的方法  二、调用函数 1.函数调用的形式

    2024年02月05日
    浏览(31)
  • C++类相关oj题目分享(计算日期到天数转换、日期差值、打印日期、日期累加)

    传送门 首先我们知道肯定是用一个数组来储存每个月的天数,更加方便。同时默认2月是28天,如果是闰年就是29。 总体的计算思路是: 1 月到 month-1 月的所有天数,加上 month 月的 day 。使用for循环能正好契合这个思路 当然这题的思路和解法非常多,我这也只是其中一个。 传

    2024年01月20日
    浏览(30)
  • 【C语言】函数的定义、传参与调用(二)

    💗个人主页💗 ⭐个人专栏——C语言初步学习⭐ 💫点击关注🤩一起学习C语言💯💫   目录 导读: 1. 函数的嵌套调用 1.1 什么是嵌套调用 1.2 基础实现 1.3 调用流程解析  2. 函数的链式访问 2.1 什么是链式访问  2.2 基础实现 3. 函数递归 3.1 什么是递归 3.2 递归的两个必要条

    2024年02月08日
    浏览(37)
  • 【Python实用基础整合(二)】DataFrame是否为空判断及行/列差值、变化率计算

    判断整个DataFrame是否为空的方法: 示例: 而判断具体某个元素是否为NAN,则可以使用 isna() 函数: 或者使用空值的特征判断( NAN的一大特征就是不等于本身 ): 计算DataFrame行/列的差值使用: 其中, periods :默认值是1,表示两行/列的索引之差,即平移的区间,periods为正整

    2024年02月16日
    浏览(30)
  • C语言:当函数定义时遗漏函数返回值类型以及函数遗漏return语句

    相关阅读 C语言 https://blog.csdn.net/weixin_45791458/category_12423166.html?spm=1001.2014.3001.5482          函数定义时需要明确给出返回值的类型,比如int main();表示主函数返回一个整数值,void func();表示func函数不返回值(但会函数也会返回,这是需要区分的)。         void main();这种写法

    2024年02月19日
    浏览(29)
  • 【go语言】2.1.3 函数的定义和使用

    在 Go 语言中,函数是一种代码抽象和复用的方式。函数可以接受参数,执行特定的操作,并返回结果。 函数的定义以  func  开始,后面跟着函数名、参数列表、返回值列表(可选)以及函数体。下面是一个函数定义的例子: 这个函数接受一个类型为  string  的参数

    2024年02月15日
    浏览(37)
  • C语言第八课-----函数定义和使用的延续

    作者前言                                                   个人主页::小小页面                  gitee页面:秦大大                 一个爱分享的小博主 欢迎小可爱们前来借鉴 __________________________________________________________          1.复习                 库函

    2024年02月15日
    浏览(32)
  • C语言第七课----------函数的定义及使用--------C语言重要一笔

                                                      个人主页::小小页面                  gitee页面:秦大大                 一个爱分享的小博主 欢迎小可爱们前来借鉴 __________________________________________________________          1.函数是什么   

    2024年02月16日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包