2016-11-06 3 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"。私はまた、各行のランダムな値 "RV"を保持(cbind)したいと思います。

最後に、最初の列が各行とすべてに対して生成されたランダム値 "RV"である行列(またはデータフレーム)その行の列の値が「RV」より小さいか、それ以外の場合は「なし」

私は一度に1行の正しい値を特定する方法を知っていますが、これは適用関数を使用します。私は、これは簡単ですが、完全に困惑することになるだろうと思った可能

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

場合は、forループを回避したいと思いますので、おそらく私はループのために必要があるでしょう、それが、私の実際のデータセットが100,000行の近くにあります。任意のアイデアが大幅に

+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

ありがとう、これは素晴らしいです。マージン= 1の部分が何をしているのか不思議ですか? – Jdan

+0

@Jdan 'margin'は、行列を反復処理する方法を' apply'に指示します。値1は行単位の操作を行い、2は列単位の操作を行います。 'mat < - matrix(1:9、nrow = 3);を実行します。プリント(マット);適用する(マット、マージン= 1、ファン=合計)。 (mat、MARGIN = 2、FUN = sum) 'を適用して違いを確認します。 – Zach

関連する問題