作者celestialgod (天)
看板R_Language
标题Re: [问题] 关於sweep function
时间Thu Sep 10 17:06:53 2015
举个例子
X = replicate(3, 1:5)
# [,1] [,2] [,3]
# [1,] 1 1 1
# [2,] 2 2 2
# [3,] 3 3 3
# [4,] 4 4 4
# [5,] 5 5 5
# 先看最简单的例子,每一列乘上1:3
sweep(X, 2, 1:3, '*')
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 2 4 6
# [3,] 3 6 9
# [4,] 4 8 12
# [5,] 5 10 15
# 每一行乘上1:5
sweep(X, 1, 1:5, '*')
# [,1] [,2] [,3]
# [1,] 1 1 1
# [2,] 4 4 4
# [3,] 9 9 9
# [4,] 16 16 16
# [5,] 25 25 25
所以第一个input是一个矩阵
第二个input是控制你要做行运算还是做列运算
行运算是1,列运算是2 这里跟apply的方向不同,要注意
第三个就根据第二个输入对应长度的向量
像是第二个是1,第三个的向量长度就要跟
第一个input的每一行的长度相同(也就是跟列数相同)
第四个input是有两个input的function
你如果用'+', '-', '*', '/'都是 a+b, a-b, a*b, a/b等等
你也可以自己输入自己的函数,例如:
sweep(X, 1, 1:5, function(a,b) a^2+a+b)
# [,1] [,2] [,3]
# [1,] 3 3 3
# [2,] 8 8 8
# [3,] 15 15 15
# [4,] 24 24 24
# [5,] 35 35 35
拿第一个例子来做解析
其实他就是在做这种事情:
sweep(X, 2, 1:3, '*') == '*'(X, t(replicate(nrow(X), 1:3)) )
# [,1] [,2] [,3]
# [1,] TRUE TRUE TRUE
# [2,] TRUE TRUE TRUE
# [3,] TRUE TRUE TRUE
# [4,] TRUE TRUE TRUE
# [5,] TRUE TRUE TRUE
其中的元素长这样:
t(replicate(nrow(X), 1:3))
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 1 2 3
# [3,] 1 2 3
# [4,] 1 2 3
# [5,] 1 2 3
只是sweep比replicate这个方法有效率
※ 引述《buzz20374 ()》之铭言:
: 问题: 当你想要问问题时,请使用这个类别
: [问题类型]:
: 程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
: [软体熟悉度]:
: 新手(没写过程式,R 是我的第一次)
: [问题叙述]:
: 在看 The R book 的 sweep function
: 最後面的例子我看不太懂
: sweep(matdata,1,1:10,function(a,b) b)
: sweep(matdata,2,1:4,function(a,b) b)
: http://i.imgur.com/d4brvD9.png
: function(a,b) b 代表甚麽意思呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.205.27.107
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1441876016.A.0CA.html
※ 编辑: celestialgod (123.205.27.107), 09/10/2015 17:10:37
※ 编辑: celestialgod (123.205.27.107), 09/10/2015 17:17:32
1F:推 buzz20374: 推 09/10 17:33