2017-08-15 19 views
0

私は、交通システムにWi-Fiダウンロード帯域幅とGPSデータ(緯度と経度)を含むデータフレームを持っています。私は平均的な帯域幅は、車両が北に移動しているとき、それが南に移動しているとき何であるかをデータから判断したい。forループに基づいたRベクトルへの値の追加

(DFから帯域幅及び緯度値)

bandwidth <- df$bandwidth 

latitude <-df$latitude 

(これらの両方は2800個のエントリを有する)

(車両が北または南に移動しているかどうかに応じて帯域幅の値で埋めるために、空のベクターを作成します)

movingnorth <- vector('numeric') 

movingsouth <- vector('numeric') 

(列車が北に移動している場合、帯域幅のベクトルからのデータを移動し、北ベクトルを埋める)

for(y in latitude){ 

    if(latitude[y]>= latitude[y+1]){ 
    movingnorth <- c(movingnorth, received[y])} 
    } 

ここでは、基本的には、緯度の値が上がっている場合、車両は北に移動しているため、その位置から移動する北ベクトルに帯域幅の値を入力します。私は、帯域幅ベクトルからの値の一部だけが移動ノースベクトルに追加されると期待しますが、すべての2800の値が加算されます。私はここで間違って何をしていますか?

+0

'for(seq_along(latitude)のy)'や 'for(y in 1:length(latitude))'を使いたいでしょう。 – lmo

+0

これはうまくいきました、ありがとうございました。私の元の方法はなぜ機能しないのですか? – Brad

+0

現在の場所が次の場所よりも高い場合、南に向かうことを意味していませんか? – sweetmusicality

答えて

1

Rのベクトル化演算を利用してください。まず、今、私たちは、その長さlatitudeの長さより1小さいベクトルを持っているlatitude

latitude_change <- diff(df$latitude) 

の連続する要素間の変化を見つけることがdiffを使用しています。測定の間に方向が生じるので理にかなっています。我々が最初の測定の方向を決定しないとしよう。したがって、latitude_change[i] > 0の場合は、列車は北の時刻i - 1になります。それは、関連情報ですので、私はdfのこの部分を維持しています

df$movingnorth <- c(FALSE, latitude_change > 0) 

ので表には、そのための最適な場所です。

+0

データフレームに列を追加すると、このコマンドは単に0より大きいすべての緯度変更エントリを入力し、残りのエントリにFALSEを入力するだけです。 – Brad

+0

結果は同じですが、正確ではありません。ドキュメントのベクトル演算については、https://cran.r-project.org/doc/manuals/r-release/R-intro.html#Vector-arithmeticを参照してください。 –

0

seq_along(latitude)または1:length(latitude)を使用して、latitudeの実際の要素の代わりにインデックスを返すとします。

また、latitude[y+1]が正しいことを再度確認したい場合があります。現在の構文では、データの緯度値の順序が最新のものから古いものへと変化すると仮定しています。これがあなたが提供する情報から正しいかどうかを知ることはできませんが、逆の場合があります。

Frankが指摘したように、あなたはループでベクトルを成長させていますが、これは悪い習慣です(規模が大きくなく、大きなオブジェクトでは非常に遅くなるため)。 Nathan Werthの答えは、ベクトル化された実装を示唆しています。

+0

論理エラーの他にOPループの中で何かが成長している、Rの悪い練習です。 http://www.burns-stat.com/documents/books/the-r-inferno/の第2章を参照してください。MCVEを指差すのはいいですが、答えには含まれていないと思います。コメントとしてより良い。あなたはOPの下でコメントすることはできませんので、私は自分の答えの下にコメントとしてそれを置くと言うでしょう。 – Frank

+1

提案されたコードの漸進的な改善は、提出者にとって役に立つと思います。@フランク。つまり、ループでベクターを育てることは悪い習慣であり(大きなベクターを扱うときにはかなり明確になります)、改善されたコードには改善されたコードが含まれることに同意します。以来、ベクトル化された代替案が投稿されているので、私はその答えを編集するように編集しています。私はMCVEの提案をコメントに移しています。 – Luis

+1

問題を再現するのに十分なコードを含めると便利です。 [最小限の完全で検証可能な例](https://stackoverflow.com/help/mcve)の作成に関するガイドラインを参照してください。 – Luis

関連する問題