2016-11-06 73 views
-1

我有一個類似於以下的具有隨機值的累加和的矩陣。循環遍歷行並保持列值小於隨機值R

dist<-.25 
mat<-matrix(data=runif(150,25,55)*dist, nrow = 500,ncol=150) 
mat = t(apply(mat, 1, cumsum)) 

什麼,我想要做的是:

對於每一行生成一個新的隨機值

RV<-runif(1,1,800) 

,併爲該行不到「RV」的所有列使他們=「na」。我還要保留(cbind)隨機值「RV」對每一行

最後,我想的矩陣(或數據幀),其中第一列是每行和所有生成的隨機值「RV」在該行中的列的值小於「RV」或否則爲「na」

我有一個想法,一次識別1行的正確值,但我似乎無法弄清楚如何執行這與應用功能。也許我將不得不for循環,但我的真實數據集有近10萬行,所以我想避免的,如果可能的

Y<-data.frame(mat) 
Y[1, which(Y[1,1:150]< RV)] 

我認爲這是一件容易的事,但完全難倒循環。任何想法,將不勝感激

+0

你舉的例子也不是沒有編輯重複性好,你想要的輸出是什麼樣子,目前還不清楚。你能修改一下嗎? – ulfelder

+0

@ulfelder對不起現在應該會更好。希望這可以讓問題更清楚。 – Jdan

回答

2

下面是一個使用應用的解決方案:

mat2 <- apply(mat, 
       MARGIN = 1, 
       function(x) { 
       zx <- runif(1,1,800) 
       x[x > zx] <- NA 
       return(append(zx, x)) 
       }) 

mat2 <- t(mat2) 
+0

非常感謝。只是好奇Margin = 1部分在做什麼? – Jdan

+0

@Jdan'margin'告訴'apply'如何迭代矩陣。值爲1會進行按行操作,而2會按列操作。運行'mat < - matrix(1:9,nrow = 3);打印(墊);申請(墊,MARGIN = 1,FUN =總和);申請(墊,MARGIN = 2,FUN =總和)'看看差異。 – Zach