我不是真正的懂a(chǎn)pply和function碘饼,或許壓根兒沒懂過

一直看老大代碼看得覺得可痛快了呢熙兔,刷刷地結(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ù)一起用缕减,代表的是那一行或那一列的所有元素雷客。理解的可能不對,迷糊中桥狡,掐掉搅裙,只是記錄。

參考:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末裹芝,一起剝皮案震驚了整個濱河市部逮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌局雄,老刑警劉巖甥啄,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異炬搭,居然都是意外死亡蜈漓,警方通過查閱死者的電腦和手機穆桂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來融虽,“玉大人享完,你說我怎么就攤上這事∮卸睿” “怎么了般又?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巍佑。 經(jīng)常有香客問我茴迁,道長,這世上最難降的妖魔是什么萤衰? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任堕义,我火速辦了婚禮,結(jié)果婚禮上脆栋,老公的妹妹穿的比我還像新娘倦卖。我一直安慰自己,他們只是感情好椿争,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布怕膛。 她就那樣靜靜地躺著,像睡著了一般秦踪。 火紅的嫁衣襯著肌膚如雪褐捻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天洋侨,我揣著相機與錄音舍扰,去河邊找鬼倦蚪。 笑死希坚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陵且。 我是一名探鬼主播裁僧,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼慕购!你這毒婦竟也來了聊疲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤沪悲,失蹤者是張志新(化名)和其女友劉穎获洲,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殿如,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡贡珊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年最爬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片门岔。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡爱致,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寒随,到底是詐尸還是另有隱情糠悯,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布妻往,位于F島的核電站互艾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏讯泣。R本人自食惡果不足惜忘朝,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望判帮。 院中可真熱鬧局嘁,春花似錦、人聲如沸晦墙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晌畅。三九已至但指,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抗楔,已是汗流浹背棋凳。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留连躏,地道東北人剩岳。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像入热,于是被迫代替她去往敵國和親拍棕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容