Re: [问题] 矩阵的处理...拜求各位大大

楼主: swedrf0112 (M)   2017-08-28 10:51:20
看了 c 大的 code ,启发良多XD
以下修改主要把 非 0 的 index, group by row 找最小的 column number,
再与 0 的 row bind 起来。
## data 来自 c 大的 code
DT2 <- data.table(X)
DT2[ , `:=`(V9 = sample(1:5, nrow(DT2), TRUE),
V10 = sample(LETTERS, nrow(DT2), TRUE))]
findValueF2 = function(X){
indm = as.matrix(data.table(which(X!=0, arr.ind = TRUE))[,min(col),by="row"]) ## 每个非0 row 的最左边 column number
out_d1 = data.table(indm[,1],X[indm]) ## 指 index 与 value
out_d2 = data.table(V1=setdiff(seq_len(nrow(X)),indm[,1]), v2=0) ## 补 0
outd = rbindlist(list(out_d1,out_d2))[order(V1)] ## rbind 起来 by row order
return(outd$V2)
}
st1 <- proc.time()
DT[ , v := findValue(do.call(cbind, .SD)), .SDcols = V1:V8]
t1 = proc.time() - st1
st2 <- proc.time()
DT2[ , v := findValueF2(do.call(cbind, .SD)), .SDcols = V1:V8]
t2 = proc.time() - st2
t1
# user system elapsed
# 1.16 0.05 1.24
t2
# user system elapsed
# 0.28 0.01 0.29
all.equal(DT$v,DT2$v)
# [1] TRUE
※ 引述《s3714443 (metalheads)》之铭言:
:

: 资料大概是长这样
: 我想要处理的是:
: 像第8 row就有两个非0的数字
: 那我就是取最左的那column 26.57这个数字
: 倒数第2 row 有26.43跟26.57这两个数字
: 那就是取最左边column的26.43
: 反正就是 先选取特定column(MA10down1~MA10donw9)之中
: 逐row先看有没有非0的数字,有就取最左column的,没有就取0
: 然后就是mutate出来新的一行
: 我想不到除了sapply之外的办法了
: 但是我的资料有500多万笔
: sapply可能会跑到电脑烧掉XD
: 感恩各位
作者: celestialgod (天)   2017-08-28 18:29:00
嗯嗯,我findValue都用原本R函数确实会稍慢,这样改完真的有改善不少@@

Links booklink

Contact Us: admin [ a t ] ucptt.com