0

これが露骨に明白な質問である場合はご容赦ください。私は学習に熱心な初心者の R ユーザーです。

個々の行が特定の場所を表す座標情報を含む約 150 万行の 4 列のデータ フレームがあります。私がやりたいことは、これらのデータを、より大きなボックス内の特定の場所の領域を決定する一連の if else ステートメントを保持する関数に実行することです。たとえば、点はボックスの中心、ボックスの端に沿って 1.5 インチ以内、ボックスの内側にあってもエッジでも中心でもない、またはボックスの外側にある可能性があります。

各 if ステートメントは、一連の点が指定された領域内にあるかどうかを判断し、そうである場合、結果は別のデータ フレームの対応する行に '1' を配置する if ステートメントになります。

これが私がやろうとしていることの視覚化です:

「ディメンション」と呼ばれるデータ フレームからこの位置データを取得します。

 sz_top | sz_bot |     px |   pz  |   
  3.526 |   1.615|  -1.165| 3.748 |

これらのステートメントを実行します (実際のステートメントはもっと長くなります)。「else」条件は、ポイントが完全にボックスの外にあることを意味します。

if(in center) else if(on edge) else if(in box, but not in center or on edge) else

プログラムは、どの条件が真であるかを検出すると、対応する列 (これらの列は列 50 ~ 53) の「call」と呼ばれる別のデータ フレームに 1 を配置します。ポイントが中心にあることがコードによって検出された場合、行は次のようになります。

center| edge| other_in| out| 
  1   |  0  |       0 |   0|

効率を向上させる可能性のある注意点の 1 つは、座標が実際には列 22、23、26、および 27 の「呼び出し」データ フレームにも含まれていることですが、作業が簡単だったので、それらを「次元」に移動しました。と。これは間違いなく変更できます。

ここから先に進む方法が非常に不明確です。if else ステートメントをすべて書きましたが、テストの結果で対応する行を正しくマークするために、プログラムがどの行にあるかをプログラムがどのように認識するかは不明です。

私からさらに情報が必要な場合はお知らせください。

ありがとう!

編集:

「ディメンション」データ フレームのサンプルを次に示します。

sz_top  sz_bot  px  pz
1   3.526   1.615   -1.165  3.748
2   3.29    1.647   -0.412  1.9
3   3.29    1.647   -1.213  1.352
4   3.565   1.75    -1.041  2.419
5   3.565   1.75    -0.357  1.776
6   3.565   1.75    0.838   0.834
7   3.541   1.724   -1.619  3.661
8   3.541   1.724   -2.498  2.421
9   3.541   1.724   -1.673  2.348
10  3.541   1.724   -1.572  2.982
11  3.305   1.5 -1.316  2.842

これは、私の if ステートメントの 1 つの例です。問題のボックスの周りのさまざまな場所を見るだけで、他のものはかなり似ています。

  if(
    ((as.numeric(as.character(dimensions$px))*12)>= -3)
    &&
      ((as.numeric(as.character(dimensions$px))*12)<= 3)
    &&
      ((as.numeric(as.character(dimensions$pz))*12)<=((as.numeric(as.character(dimensions$sz_top))*12-as.numeric(as.character(dimensions$sz_bot))*12)/2)+(as.numeric(as.character(dimensions$sz_bot))*12)+3)
    &&
      ((as.numeric(as.character(dimensions$pz))*12)>=((as.numeric(as.character(dimensions$sz_top))*12-as.numeric(as.character(dimensions$sz_bot))*12)/2)+(as.numeric(as.character(dimensions$sz_bot))*12)-3)
  ){return(1)
  } 
4

2 に答える 2

0

次のように進めます(例を少し変更しました):

最初に空のデータフレームを事前に割り当てcallます。

call=data.frame(matrix(NA,nrow=nrow(dimensions),ncol=4))
colnames(call)=paste("Q",1:4,sep="")

とだけでwith列名にアクセスできるようにするために使用します。したがって、コードが読みやすくなります。dimensionspxpy

with(dimensions,{
call$Q1<<-ifelse(px>0&pz>0,1,0);
call$Q2<<-ifelse(px<0&pz>0,1,0);
call$Q3<<-ifelse(px<0&pz<0,1,0);
call$Q4<<-ifelse(px>0&pz<0,1,0);})

<<-の代わりに に注意してください<-。が評価されるcall環境にないため、この特別な演算子を使用する必要があります。{call$Q1<<-ifelse ...}では<<-、親環境も検索されます。

ところで: パフォーマンスが問題になる場合は、data.tableパッケージを見てください。

于 2013-05-10T01:03:40.517 に答える