Re: [問題]不使用for改使用apply寫法的可能性
(同是apply家族愛好者先shout out一下XD)
以前看過版主C大跟其他前輩版友的討論,結論是 apply 效率並沒有比較好
(印象中好像背後都還是用for迴圈?!)
不過我覺得向量化(vectorized)是R語言裡面很重要的一個特性
也是functional programming跟其他程式語言不一樣的地方
我自己也喜歡做for轉apply的練習
=== 分隔線 ===
以下的寫法只是隨便寫的(甚至可以說骨子裡還是for的邏輯...)
請其他版友分享更好的寫法!!
1. cross validation:
1.a 還是用到folds
sapply(1:5,function(i){
testIndexes <- which(folds==i,arr.ind=T)
# 做你想做的事情
# ex: 找測試集的最大值跟訓練集的最小值
max_intest <- max(dataset[testIndexes,])
min_intrain <- min(dataset[-testIndexes,])
#回傳結果
c(max_intest,min_intrain)
})
其實這個跟for的寫法根本換湯不換藥XD
1.b 使用split (不要用cut跟folds)
原po原本的方法是先用sample()抽樣打亂原始data的順序後再用cut()指定組別
提供sapply + split的做法:
sapply(split(dataset,1:5),function(x){
test <- x # test dataset
train <- dataset[-as.numeric(row.names(x)),] # train dataset
# 做你想做的
c(max(test),max(train))
})
這個做法直接把dataset分成5份然後將該dataframe傳進sapply裡
不過須注意這作法取樣的順序跟cut不一樣
cut是111..222...333...444..555(各20次)
split是12345...12345...12345...(共20次)
不過因為一開始已經用sample打亂過順序了,所以個人覺得後面cut或split應該沒差
(有錯請指正>"<)
2. 偷偷問的小問題
x <- c(2:3)
y <- c(4:8)
sapply(x,function(i){
i*y
})
其實我後來很常用
sapply(x,function(){
....
})
這樣的形式寫,因為可以省略掉for裡面預先指定次數(i)的模式,寫起來也更有彈性
不過要注意function()裡面不要太多變數,不然效率應該會很差
(但是如何要評估效率我就不會惹...XD)
許願:
希望可以釣到版上其他大大 ex: celestialgod, andrew43 兩個偶像 >///<
※ 引述《empireisme (empireisme)》之銘言:
: 如題
: 最近想手刻實踐 cross validtion的算法
: 上網查了一下別人的範例code
: 如下
: x <- runif(100)*10 #Random values between 0 and 10
: y <- x+rnorm(100)*.1 #y~x+error
: dataset <- data.frame(x,y) #Create data frame
: dataset<- dataset[sample(nrow(dataset)),]
: dataset
: #here is the trick
: folds <- cut(seq(1,nrow(dataset)),breaks=5,labels=FALSE)
: folds
: sample(nrow(dataset))
: for(i in 1:5){
: #Segement your data by fold using the which() function
: #這裡就是我想問的
: testIndexes <- which(folds==i,arr.ind=TRUE)
: #這裡就是我想問的
: testData <- dataset[testIndexes, ]
: trainData <- dataset[-testIndexes, ]
: #Use the test and train data partitions however you desire...
: #必須要在這個步驟去套入model 然後計算MSE
: }
: 他在切traing 和Testing時 使用了 fold的技巧
: 但是這整段有沒有可能 不使用for 迴圈 而改用apply家族去實現
: 因為真的太喜歡使用apply的簡潔了
: 還希望版友回答
: 偷偷問另外一個問題
: 我有一個function s 去計算 x*y
: s<- function(x,y){ x*y }
: s( c(2,3) , c(4,5) )
: 這裡我會得到 8 15
: 但其實我想得到的是所有的可能性
: 8,10,12,15
: 請問我要如何在保有 input是 c(2,3) , c(4,5) 下 得到我要的結果呢
: 更甚至在 s ( c(2,3),c(4,5,6,7,8) ) 狀況下也可以得到遍歷的結果
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.224.210.149 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1585093941.A.3E6.html
→
03/25 08:07,
4年前
, 1F
03/25 08:07, 1F
→
03/25 10:23,
4年前
, 2F
03/25 10:23, 2F
→
03/25 10:25,
4年前
, 3F
03/25 10:25, 3F
→
03/25 11:31,
4年前
, 4F
03/25 11:31, 4F
→
03/25 13:25,
4年前
, 5F
03/25 13:25, 5F
推
03/26 08:53,
4年前
, 6F
03/26 08:53, 6F
推
03/26 08:57,
4年前
, 7F
03/26 08:57, 7F
→
03/26 09:38,
4年前
, 8F
03/26 09:38, 8F
→
03/26 09:38,
4年前
, 9F
03/26 09:38, 9F
→
03/26 09:38,
4年前
, 10F
03/26 09:38, 10F
→
03/26 09:38,
4年前
, 11F
03/26 09:38, 11F
推
03/26 13:36,
4年前
, 12F
03/26 13:36, 12F
→
03/26 13:41,
4年前
, 13F
03/26 13:41, 13F
討論串 (同標題文章)
R_Language 近期熱門文章
PTT數位生活區 即時熱門文章