作者swedrf0112 (M)
看板R_Language
标题Re: [问题] 矩阵的处理...拜求各位大大
时间Mon Aug 28 10:51:20 2017
看了 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)》之铭言:
: http://imgur.com/a/1s7Is
: 资料大概是长这样
: 我想要处理的是:
: 像第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
: 感恩各位
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 39.12.69.153
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1503888683.A.35C.html
1F:推 celestialgod: 嗯嗯,我findValue都用原本R函数确实会稍慢,这样改 08/28 18:29
2F:推 celestialgod: 完真的有改善不少@@ 08/28 18:29