7

2 つのベクトルを調べて、2 つのベクトルの値の符号に応じて異なる値を返す関数を実行したいと考えています。2 つの値を比較する関数を作成しましたが、これを 2 つのベクトルで実行したいと考えています。そのため、sapply を使用しましたが、予想とは異なる結果が得られています。

bear.correction<-  function(x,y){
                                if(x > 0 && y < 0){
                                  return(90)
                                }else if(x < 0 && y < 0){
                                  return(180)
                                }else  if(x < 0 && y > 0){
                                  return(270)
                                }else   return(0)
                              }

以下は、期待される (そして望ましい) 結果を示します。

  bear.correction(1,-1)
  bear.correction(1,1)
  bear.correction(-1,1)
  bear.correction(-1,-1)

結果: 90、0、270、180

ただし、同じ比較をしようとしても、ベクトルを sapply で使用すると、異なる結果が得られます。

  x <- c(1,1,-1,-1)
  y <- c(-1,1,1,-1)
  sapply(x,bear.correction,y)

結果: 90、90、180、180。

何が悪いのかわからないので、助けてください!

4

4 に答える 4

11

mapply()代わりに使用する必要がありますsapply()

mapply(bear.correction,x,y)

なんで?...の各エントリに適用sapply()されますが、それぞれの場合に 2 番目の引数としてベクトル全体を指定するため、4 つのケースすべてで最初のエントリのみを調べます。複数のベクトル (またはその他のデータ構造)内の複数のエントリを「ウォーク アロング」するには、 を使用します。bear.correction()x ybear.correction()ymapply()

于 2013-01-07T13:17:57.313 に答える
5

sapply の代わりに mapply を使用する必要があります

mapply(bear.correction,x,y)

[1]  90   0 270 180
于 2013-01-07T13:17:15.193 に答える
4

次のように関数に a を入れbrowser()ます:

bear.correction<-  function(x,y){

  browser()
  if(x > 0 && y < 0){
    return(90)
  }else if(x < 0 && y < 0){
    return(180)
  }else  if(x < 0 && y > 0){
    return(270)
  }else   return(0)
}

パラメータとして正確に与えるものが表示されます:

Browse[1]> x
[1] 1
Browse[1]> y
[1] -1  1  1 -1

したがって、他の人がここで言ったようmapplyに、原子ベクトルではなく、スカラー値を与えるために使用する必要があります。

plyrしかし、ここでの使用は本当に簡単だと思います(素敵な出力形式)

library(plyr)
dat <- data.frame(x=x,y=y)
ddply(dat,.(x,y),function(r) bear.correction(r$x,r$y))
   x  y  V1
1 -1 -1 180
2 -1  1 270
3  1 -1  90
4  1  1   0
于 2013-01-07T13:18:23.037 に答える
3

使用したい場合applyは、関数を少し変更する必要があります。

bear.correction<-  function(xy){
                                if(xy[1] > 0 && xy[2] < 0){
                                  return(90)
                                }else if(xy[1] < 0 && xy[2] < 0){
                                  return(180)
                                }else  if(xy[1] < 0 && xy[2] > 0){
                                  return(270)
                                }else   return(0)
                              }

この関数は 2 つの値のベクトルを取り、古いものとxy同じように最初の値を使用し、古いものxと同じように 2 番目の値を使用します。y

x <- c(1,1,-1,-1)
y <- c(-1,1,1,-1)

xyx<-cbind(x,y)


apply(xyx,1, bear.correction)
于 2013-01-07T13:22:14.403 に答える