42

私は配列を持っています:

a <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

次の関数を実装したい:

w<-function(a){
  if (a>0){
    a/sum(a)
  }
  else 1
}

この関数は、0より大きい値があるかどうかを確認しa、ある場合は、各要素を合計で除算します。

それ以外の場合は、1を記録する必要があります。

次の警告メッセージが表示されます。

 Warning message:
 In if (a > 0) { :
 the condition has length > 1 and only the first element will be used

どうすれば機能を修正できますか?

4

6 に答える 6

64

多分あなたが欲しいifelse

a <- c(1,1,1,1,0,0,0,0,2,2)
ifelse(a>0,a/sum(a),1)

 [1] 0.125 0.125 0.125 0.125 1.000 1.000 1.000 1.000
 [9] 0.250 0.250
于 2013-01-05T10:25:47.573 に答える
47

ifステートメントはベクトル化されていません。ベクトル化されたifステートメントの場合は、を使用する必要がありますifelse。あなたの場合、書くだけで十分です

w <- function(a){
if (any(a>0)){
  a/sum(a)
}
  else 1
}

または短いベクトル化されたバージョン

ifelse(a > 0, a/sum(a), 1)

最初の関数は長さ1の出力ベクトル(他の部分)をifelse与え、長さの長さに等しい長さの出力ベクトルを与えるので、どちらを使用するかによって異なりますa

于 2013-01-05T10:29:32.343 に答える
22

この警告が表示される理由について、ディスカッション全体にポイントを追加するだけです(以前ははっきりしていませんでした)。これを取得する理由は、前述のとおりです。この場合の「a」はベクトルであり、不等式「a> 0」はTRUEとFALSEの別のベクトルを生成します(「a」は> 0かどうか)。

代わりに、「a> 0」の値があるかどうかをテストする場合は、関数-「any」または「all」を使用できます。

一番

于 2015-04-30T13:56:01.467 に答える
20

これがなくても簡単な方法ifelseです:

(a/sum(a))^(a>0)

例:

a <- c(0, 1, 0, 0, 1, 1, 0, 1)

(a/sum(a))^(a>0)

[1] 1.00 0.25 1.00 1.00 0.25 0.25 1.00 0.25
于 2013-01-05T12:42:10.523 に答える
3

この質問に出くわしたのは、関数を定義していて、他の人が指摘したように配列で呼び出されているのと同じようなことをしようとしたときでした。

このようなことを行うこともできますが、このシナリオでは、Svenの方法に比べてエレガントではありません。

sapply(a, function(x) afunc(x))

afunc<-function(a){
  if (a>0){
    a/sum(a)
  }
  else 1
}
于 2017-11-13T00:22:28.743 に答える
2

lapply関数を正常に作成してから関数を使用してください。

lapply(x="your input", fun="insert your function name")

lapplyリストを提供するので、関数を使用してunlist関数からそれらを削除します

unlist(lapply(a,w))
于 2019-03-31T11:28:17.523 に答える