前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言中易忽略的基础:循环补齐规则

R语言中易忽略的基础:循环补齐规则

作者头像
生信菜鸟团
发布2024-03-18 14:00:26
670
发布2024-03-18 14:00:26
举报
文章被收录于专栏:生信菜鸟团生信菜鸟团

问题来源

R语言中,矩阵是如何除以向量的?。。。。。。。。。。。。。。。。。从Normalize引发的思考(表达矩阵除以一个等列长的向量)

比如,r语言中,下面两种计算的结果是多少?

代码语言:javascript
复制
x <- c(1, 2)
y <- c(10, 20, 30, 40)
x * y
代码语言:javascript
复制
m <- matrix(
  seq(1,15,1),
  nrow = 3 
)

m/c(1,2,3)

循环补齐(recycling) 规则

做算术运算时,当两个向量长度相等的时候,就一一对应的完成计算;当两个向量长度不相等的时候,短的向量会循环补齐,保持与长向量的长度一致后,再做运算。

向量运算

  • 长向量的长度正好是短向量的整数倍
代码语言:javascript
复制
x <- 1
y <- c(10, 20, 30, 40)
x + y
## [1] 11 21 31 41
  • 长向量的长度正好是短向量的整数倍
代码语言:javascript
复制
x <- c(1, 2)
y <- c(10, 20, 30, 40)
x * y
## [1] 10 40 30 80
  • 长向量的长度不是短向量的整数倍
代码语言:javascript
复制
x <- c(1, 2, 3)
y <- c(10, 20, 30, 40, 50, 60, 70)
x + y
x+y等同于 c(1, 2, 3,1,2,3)+ c(10, 20, 30, 40, 50, 60, 70)


## Warning in x + y: longer object length is not a multiple of shorter object
## length
## [1] 11 22 33 41 52 63 71
代码语言:javascript
复制
x <- c(1, 2, 3)
y <- c(10, 20, 30, 40, 50, 60, 70)
x * y
x * y 等同于 c(1, 2, 3,1 ,2,3,1) * c(10, 20, 30, 40, 50, 60, 70)
## Warning in x * y: longer object length is not a multiple of shorter object

## length
## [1]  10  40  90  40 100 180  70

长度不是整数倍关系的时候,R语言会提出友好的警告,这个警告是非常有必要的,一方面提醒写代码的人是不是写漏了一些数据,另一方面提醒会给看代码的人产生迷惑。因此,为了代码的可读性,除非某一个向量长度为1,我们尽可能避免长度不一致的向量之间的运算。

矩阵与向量之间的运算

我的理解:矩阵除以向量时,可以将矩阵按列拆分成一个长的向量,然后将被除数向量视为列向量,并将其重复复制,循环补齐矩阵的元素个数。然后,相对应的元素进行计算。

代码语言:javascript
复制
m <- matrix(
  seq(1,15,1),
  nrow = 3 
)

m/c(1,2,3)

真实运算过程可以理解为:

代码语言:javascript
复制
#把短的向量循环补齐
seq(1,15,1)/c(1,2,3, 1,2,3, 1,2,3,1,2,3,1,2,3  )
matrix(seq(1,15,1)/c(1,2,3, 1,2,3, 1,2,3,1,2,3,1,2,3  ),nrow = 3)

在使用循环补齐时,应注意以下几点:

  • 循环补齐可能会导致数据丢失或错误。例如,如果向量包含缺失值,则在循环补齐后,缺失值将被重复复制。
  • 循环补齐可能会降低效率。例如,如果向量非常短,则循环补齐会导致大量的重复计算。

后记

虽然我接触生信已经有6年时间了,但是至今才发现自己竟然对这么基础的运算都没有仔细去了解过。习惯了做一个调包侠,却忽略了最基本的运算与规则!或许这也是部分生信人的苦恼。学无止尽,让我们继续努力吧。

代码语言:javascript
复制
参考:
https://bookdown.org/wangminjie/R4DS/baseR-operators.html#%E5%BE%AA%E7%8E%AF%E8%A1%A5%E9%BD%90recycling
https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/rmarkdown.html
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信菜鸟团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题来源
  • 比如,r语言中,下面两种计算的结果是多少?
  • 循环补齐(recycling) 规则
    • 向量运算
      • 矩阵与向量之间的运算
        • 后记
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档