Re: [問題] 矩陣的處理...拜求各位大大
拋磚引玉,提供兩個方法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
: 感恩各位
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.169.57.26
※ 文章網址: https://www.ptt.cc/bbs/R_Language/M.1503825048.A.0CB.html
※ 編輯: swedrf0112 (1.169.57.26), 08/27/2017 17:13:01
→
08/27 17:12, , 1F
08/27 17:12, 1F
→
08/27 17:14, , 2F
08/27 17:14, 2F
→
08/27 17:45, , 3F
08/27 17:45, 3F
→
08/27 17:45, , 4F
08/27 17:45, 4F
→
08/27 17:45, , 5F
08/27 17:45, 5F
推
08/27 18:56, , 6F
08/27 18:56, 6F
→
08/27 18:56, , 7F
08/27 18:56, 7F
→
08/28 10:37, , 8F
08/28 10:37, 8F
討論串 (同標題文章)
完整討論串 (本文為第 2 之 5 篇):