3

マトリックスの列から最小値 (0 より大きい) を取得しようとしています。次に、その最小値が発生した行番号を使用して、最小行 (識別された) の下のすべての行に (式として) 適用される値を計算します。以前)。

例を挙げて説明しましょう: x を次のように定義すると:

x<-rbind(c(0, 0, 0), c(0,0,3), c(0,3,5))

それxは次のとおりです。

     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    3
[3,]    0    3    5

次に、列 1 には最小値がなく、列 2 にはインデックス 3 に最小値があり、列 3 にはインデックス 2 に最小値があることを確認したいと思います。

そこで、最小値のベクトルを作成する次の試みを作成しました。

min<-apply(x,2,function (v) min(which(v>0), na.rm = TRUE))

これは私に警告を与えます:

Warning message:
In min(which(v > 0), na.rm = TRUE) :
  no non-missing arguments to min; returning Inf

(問題 1): 回避方法がわかりません。

(問題 2): 最小値 (存在する場合) の結果を取得し、ベクトル min の値に基づいて関数の値を計算し、ベクトル min のインデックスを使用して値を選択する必要があります。別のマトリックスからst これは、ループに頼らずに少し遊んでみましたが、どうすればよいかわかりません。

例に戻ると、 の最初の値minInfであるため、ベクトルcalc.resultsは 0 になり、 の次の値minは 3 になるため、行列からst2 列目 (3) の 3 行目を選択し、この値を使用して計算しますなどの 2 番目の列の結果calc.results。操作が完了calc.resultsすると、次のようになります (たとえば、単純化すると、 からの値は何も実行されませんst)。

[1] 0 3 3

次に、(の列に等しい のインデックスを使用して) で識別した行に到達した後でのみ、 の値を差し引いcalc.resultsて行列に戻す必要があります。他のすべての行は変更されません。stcalc.resultsminminst

この例では、最終結果は次のようになります。

     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    2

2 列目の値は 3 であり、2 列目の 3minの値は、 2 列目で行 3 のみで 3 が減算されているためです (実際、列がゼロになるのは次の積です)。この例であり、一般的には当てはまりません)。calc.resultsst

4

3 に答える 3

2

次のようなことをしようとしているようです。

apply(x, 2, function(y) { y[y > 0] <- (y[y > 0] - min(y[y > 0])); y })
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    2
于 2013-02-18T05:00:39.610 に答える
0

問題(1)

警告はmin、非数値を取得しているという事実によるものです。つまり、integer(0)

# try this to see the warning clearly: 
min(integer(0))

# try this to see where you are getting integer(0)
apply(x,2,function (v) which(v>0))

警告を回避するには、次のような if ステートメントを追加できますfunction(v)

apply(x, 2, function (v) min(ifelse(any(v>0), which(v>0), 0), na.rm = TRUE))

ただし、これは単なる警告であることを覚えておいてください。具体的に何が原因であるかを認識している限り、あまり心配する必要はありません。

于 2013-02-18T04:58:08.387 に答える
0

problem(1): You can at least identify the columns without any min, then remove them later as needed.

min <- apply(x,2,function (v) ifelse(max(v)==0, NA , min(which(v>0), na.rm = TRUE)))
于 2013-02-18T05:04:27.570 に答える