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

楼主: swedrf0112 (M)   2017-08-27 17:10:46
抛砖引玉,提供两个方法XD
## 方法1: 使用 apply
# 生成测试资料
d1 = data.frame(matrix(c(0,1,2,0,0,0,1,0,2,0,2,1),nrow=4,byrow=T))
d1
### X1 X2 X3
### 1 0 1 2
### 2 0 0 0
### 3 1 0 2
### 4 0 2 1
apply(d1,1,function(x){
ind = which(x!=0)
return(ifelse(length(ind)==0,0,x[min(ind)]))
})
## [1] 1 0 1 2
里面的 ifelse 主要是针对 0,0,0 取 min(ind) 的时候会有 Warning
不然直接 return(x[min(which(x!=0))]) 也可以XD
## 方法2: 使用 data.table
library(data.table)
d2 = data.table(d1)
findLeftValueF = function(input, ...){
x = unlist(input) ## 每一列都是 List 物件,所以要做 unlist
ind = which(x!=0)
return(ifelse(length(ind)==0,0,x[min(ind)]))
}
d2[, val := findLeftValueF(.SD),by=row.names(d2)]
d2$val
## [1] 1 0 1 2
至于哪个比较快我就没测了,应该会比 sapply 效率好点XD
有错误的话请板上各位大大再指教囉~
※ 引述《s3714443 (metalheads)》之铭言:
: http://imgur.com/a/1s7Is
: 资料大概是长这样
: 我想要处理的是:
: 像第八行就有两个非0的数字
: 那我就是取最左的那排 26.57这个数字
: 倒数第二排有26.43跟26.57这两个数字
: 那就是取最左边的26.43
: 反正就是 特定栏之中 先看有没有非0的数字,有就取最左的,没有就取0
: 然后就是mutate出来新的一行
: 我想不到除了sapply之外的办法了
: 但是我的资料有500多万笔
: sapply可能会跑到电脑烧掉XD
: 感恩各位
作者: celestialgod (天)   2017-08-27 17:12:00
apply底层就是sapply了...
楼主: swedrf0112 (M)   2017-08-27 17:14:00
感谢楼上c大 又学到了XD
作者: celestialgod (天)   2017-08-27 17:45:00
不管怎样你的方式都是row-wise都会慢很多还是要想办法直接用vectorise想法直接处理才是根解
作者: s3714443 (metalheads)   2017-08-27 18:56:00
对 因为资料很大 所以想用矩阵的思维处理 但还是感谢这位大大
楼主: swedrf0112 (M)   2017-08-28 10:37:00
感谢!!

Links booklink

Contact Us: admin [ a t ] ucptt.com