一直看老大代碼看得覺得可痛快了呢熙兔,刷刷地結(jié)果就出來了悲伶,到自己想做個芝麻大點兒的事,頭發(fā)抓掉一大把住涉,都弄不出來麸锉。有些時候,以為懂和會舆声,只是沒實際去用花沉,等真到自己上手,用那個網(wǎng)絡(luò)語形容-啥也不是媳握。不墨跡啦碱屁,記錄下。
主要是想改一個表達(dá)矩陣?yán)锒暾遥切┬∮?的數(shù)值變?yōu)?娩脾。變成apply和function的事情了,我是真的不會用打毛。
> #下面三行代碼就是前兩行覺得沒問題呀柿赊,第三行就是不對,哎
> dat[8,][dat[8,]< -1] <- 0
> dat[9,][dat[9,]< -1] <- 0
> apply(dat,1,function(x){x[x< -1] <- 0})
> #問老大隘冲,一行代碼搞定闹瞧。就是下面這個绑雄。
> dat[dat<0]=0
新建一個小數(shù)據(jù)模擬上面的代碼的問題
> mm<- data.frame(aa=seq(1:5),
+ bb=c(4,5,0,1,2),
+ cc=rep(1,5))
>
> mm
aa bb cc
1 1 4 1
2 2 5 1
3 3 0 1
4 4 1 1
5 5 2 1
> #用了下面的兩個函數(shù)展辞,其實意思和前面的是一樣的,結(jié)果依然是不對的万牺。
> apply(mm,1,function(x){x[x< 2] <- 'zz'})
[1] "zz" "zz" "zz" "zz" "zz"
> apply(mm,2,function(x){x[x< 2] <- 'zz'})
aa bb cc
"zz" "zz" "zz"
>
上面的結(jié)果肯定不對罗珍,得再想想,搜索到一個很好的例子脚粟,其實之前也見過
> #還是得回去再理解一下了覆旱。
> ##################### 點石舉例 ##########################
> #http://www.crickcollege.com/news/236.html
> l1 <- c(4,9,16)
> l2 <- c(25,36,49)
> matrix <- cbind(l1,l2)
> matrix_apply1 <- apply(matrix,1,sum)
> matrix_apply1
[1] 29 45 65
> matrix_apply2 <- apply(matrix,2,sum)
> matrix_apply2
l1 l2
29 110
> matrix_apply3 <- apply(matrix,1,sqrt)
> matrix_apply3
[,1] [,2] [,3]
l1 2 3 4
l2 5 6 7
> matrix_apply4 <- apply(matrix,2,sqrt)
> matrix_apply4
l1 l2
[1,] 2 5
[2,] 3 6
[3,] 4 7
> #自定義函數(shù)(有一個自變量)
> #將sqrt變?yōu)?function(x) MyFunction(x)。這一寫法翻譯成中文是核无,應(yīng)用一個自變量為x的函數(shù)扣唱,這個函數(shù)(我之前定義過,起了名字)叫MyFunction团南,矩陣?yán)锏拿恳粋€元素(按照運算順序)都是x噪沙。
> myfun1 <- function(x){
+ result <- 1+sqrt(x)
+ return(result)
+ }
> #結(jié)果成行
> matrix_apply5 <- apply(matrix,1, function(x) myfun1(x))
> matrix_apply5
[,1] [,2] [,3]
l1 3 4 5
l2 6 7 8
> #結(jié)果成列
> matrix_apply6 <- apply(matrix,2, function(x) myfun1(x))
> matrix_apply6
l1 l2
[1,] 3 6
[2,] 4 7
[3,] 5 8
> #有兩個自變量(有兩個自變量)
> myfun2 <- function(x,y){
+ result <- sqrt(x)+y
+ return(result)
+ }
> matrix_apply7 <- apply(matrix,1, function(x) myfun2(x,10))
> matrix_apply7
[,1] [,2] [,3]
l1 12 13 14
l2 15 16 17
>
> matrix_apply8 <- apply(matrix,2, function(x) myfun2(x,10))
> matrix_apply8
l1 l2
[1,] 12 15
[2,] 13 16
[3,] 14 17
>
> matrix_apply9 <- apply(matrix,1, function(y) myfun2(100,y))
> matrix_apply9
[,1] [,2] [,3]
l1 14 19 26
l2 35 46 59
>
> matrix_apply10 <- apply(matrix,1, function(y) myfun2(100,y))
> matrix_apply10
[,1] [,2] [,3]
l1 14 19 26
l2 35 46 59
>
> #返回這個新建的小數(shù)據(jù)mm。
> mm
aa bb cc
1 1 4 1
2 2 5 1
3 3 0 1
4 4 1 1
5 5 2 1
>
> #嘗試(1)
> fun1<- function(x){
+ 'zz' <- x<1
+ return(x)
+ }
>
> apply(mm,2,function(x)fun1(x))
aa bb cc
[1,] 1 4 1
[2,] 2 5 1
[3,] 3 0 1
[4,] 4 1 1
[5,] 5 2 1
>
> #嘗試(2)
> fun2 <- function(x){
+ 'zz' <- x[x<1]
+ return(x)
+ }
> apply(mm,2,function(x)fun2(x))
aa bb cc
[1,] 1 4 1
[2,] 2 5 1
[3,] 3 0 1
[4,] 4 1 1
[5,] 5 2 1
>
> #嘗試(3)
> fun3 <- function(x){
+ x[x<1] <- 'zz'
+ return(x)
+ }
> apply(mm,2,function(x)fun3(x))
aa bb cc
[1,] "1" "4" "1"
[2,] "2" "5" "1"
[3,] "3" "zz" "1"
[4,] "4" "1" "1"
[5,] "5" "2" "1"
> apply(mm,1,function(x)fun3(x))
[,1] [,2] [,3] [,4] [,5]
aa "1" "2" "3" "4" "5"
bb "4" "5" "zz" "1" "2"
cc "1" "1" "1" "1" "1"
>
>
>
> #嘗試(4)如果不加return呢吐根?
> fun4 <- function(x){
+ x[x<1] <- 'zz'
+ }
> apply(mm,2,function(x)fun4(x))
aa bb cc
"zz" "zz" "zz"
> #不加return就不行了正歼,所以按照之前的寫法如下,就不對
> apply(mm,2,function(x){x[x<1] <- 'zz'})
aa bb cc
"zz" "zz" "zz"
> #那么我思考的是拷橘,如果想要的結(jié)果是為了返回一個新生成的值局义,就要加一個return喜爷,這個return可以返回要的值
> #嘗試(5) 下面一句就輕松搞定了,是老大發(fā)給我的萄唇。
> nn <- mm
> nn[nn<1]='zz'
>
但是還是不是理解檩帐,就把老大最近一篇公眾號上的用了function函數(shù)看看,再理解下穷绵。
> #https://mp.weixin.qq.com/s/qS0z23mMxJYpGfOvsO_TIQ
> set.seed(123)
> dat=data.frame(s1=rnorm(26),
+ s2=rnorm(26),
+ s3=rnorm(26),
+ s4=rnorm(26))
> rownames(dat)=LETTERS
> dat['A',]
s1 s2 s3
A -0.5604756 0.837787 -0.04287046
s4
A 0.1813035
> pos=match(c('D','G','Z'),rownames(dat))
> apply(dat, 2, function(x){
+ order(x,decreasing = T)[pos]
+ })
s1 s2 s3 s4
[1,] 11 7 24 12
[2,] 7 9 6 6
[3,] 18 17 20 22
>
> #上面的這個function函數(shù)和apply函數(shù)我能不能按照剛才的步驟再拆一下,然后理解結(jié)果是要干什么
> #
> myfun11 <-function(x){
+ order(x,decreasing = T)[pos]
+ }
> apply(dat,2,function(x)myfun11(x))
s1 s2 s3 s4
[1,] 11 7 24 12
[2,] 7 9 6 6
[3,] 18 17 20 22
> #上面的重新定義了一個myfun11以后轿塔,得到的這個結(jié)果也是能夠運行出和老大直接apply(dat, 2, function(x){order(x,decreasing = T)[pos]})一樣的結(jié)果的,是不是可以理解成仲墨,如果我要是想要新替換已有變量的時候勾缭,就一定要定義為一個變量,如果僅僅是輸出一個結(jié)果就不用必須新定義一個變量了目养×┯桑或許我理解的也不對。
> #上面的理解:我用function函數(shù)定義了一個myfun11函數(shù)癌蚁,x是這個myfun11函數(shù)里面的變量幻梯,這個里面的x,指代的應(yīng)該是dat里每一列中所有的元素努释。這個order是可以和sum函數(shù)類似的道理碘梢,可以用在對多個元素的處理上。
>
再翻一個例子
> #https://mp.weixin.qq.com/s/XQybC6W0aLrbyzHNvJnDvA
> mycal<-function(x){
+ mean<-mean(x)
+ sd<-sd(x)
+ result <- list(mean=mean,sd=sd)
+ return(result)
+ }
> x<-c(1,2,3,80)
> mycal(x)
$mean
[1] 21.5
$sd
[1] 39.00855
>
> mysave<-function(earn,spend,lost){
+ save<- earn-spend-lost
+ result <- list(save=save)
+ return(result)
+ }
> mysave(earn = 1000,spend = 80,lost = 10)
$save
[1] 910
>
> myscore<-function(paper,attendence){
+ score<- paper*0.7+attendence*.3
+ result <- list(score=score)
+ return(result)
+ }
> myscore(paper = 92,attendence = 70)
$score
[1] 85.4
還有很好的在代碼的例子伐蒂,再體會一下煞躬,技能樹的推文里很多。我現(xiàn)在的理解是:這里function(x)里的x不和apply一起用的時候逸邦,就是可以是任意變量恩沛,可以是單個元素也可以是整體數(shù)據(jù);如果是和apply函數(shù)一起用缕减,代表的是那一行或那一列的所有元素雷客。理解的可能不對,迷糊中桥狡,掐掉搅裙,只是記錄。
參考: