Re: [問題] apply 取代for

作者: celestialgod (天)   2018-03-29 23:35:04
※ 引述《disney82231 (小刀會序曲)》之銘言:
: [問題類型]:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
:
: [軟體熟悉度]:
: 入門(寫過其他程式,只是對語法不熟悉)
: [問題敘述]:
: 用for 寫了一個迴圈,想用apply寫出一樣的結果
: 另外想請問,在多數情況下,apply都能取代for嗎
: [程式範例]:
: for (i in 2:10){
: x$v1[x[,i]==1] <- i }
: }
: 若每列x的第i行=1時,x每列的第一行改成i
: [關鍵字]:
: apply for
測試了一下我原本預想的方法,發現用for就很快了XDDD
然後回一下,像這種case,其實用apply是不適合的
基本上直接去修改原本的值是最簡單的
library(data.table)
## random generation
x <- matrix(rbinom(1e6, 3, 0.5), 1e5)
# check dimension of x
dim(x) # 100000, 10
## copy x
x2 <- x
## for-loop method
st <- proc.time()
for (i in 2:10)
x2[x2[ , i] == 1, ] <- i
proc.time() - st
# user system elapsed
# 0.02 0.00 0.01
## vectorized method
st <- proc.time()
# get indices which is equal to 1 in column 2 to 10
idxDT <- data.table(which(x[ , 2:10] == 1, arr.ind = TRUE))
# calculate what the value at i-th location will change to
out <- idxDT[ , .(value = min(col) + 1), by = .(row)]
# assign the values
x[out$row, ] <- out$value
proc.time() - st
# user system elapsed
# 0.12 0.01 0.14
## check equality
all.equal(x, x2) # TRUE
: > sessionInfo()
R version 3.4.2 (2017-09-28)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)
作者: obarisk (OSWALT)   2018-03-30 05:34:00
用diag會更快嗎idx = diag(x1) == 1x1$v1[2:nrow(x1)] <- ifelse(idx[2:nrow(x1)], 2:nrow(x1), x1$v1[-1])

Links booklink

Contact Us: admin [ a t ] ucptt.com