2017-08-15 48 views
0

我有一個數據框,其中包含運輸系統上的wifi下載帶寬和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])} 
    } 

在這裏,我基本上是說如果緯度值上升,那麼車輛向北移動,因此輸入從那個位置到移動矢量的帶寬值。我期望只有帶寬矢量的一部分值被添加到movenorth矢量,但所有2800值都被添加。我在這裏做錯了什麼?

+0

您可能想要使用'for(y in seq_along(latitude))'或'for(y in 1:length(latitude))'。 – lmo

+0

這工作,非常感謝你。爲什麼我的原始方法不起作用? – Brad

+0

你不是說如果當前位置高於下一個位置,它就會向南行進? – sweetmusicality

回答

1

利用R的矢量化操作。首先,我們使用diff找到latitude

latitude_change <- diff(df$latitude) 

連續元素之間的變化現在我們有它的長度大於latitude長度小於1的向量。方向發生在測量之間,所以這是有道理的。假設我們不會確定第一次測量的方向。這意味着如果latitude_change[i] > 0,那麼火車的北行時間i - 1

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

我保持的df這部分是因爲它的相關信息,因此一張桌子是爲它的理想場所。

+0

因此,通過在數據框中添加一列,該命令只需輸入大於0的所有緯度變化條目,然後用FALSE填充其餘條目? – Brad

+0

結果是一樣的,但不完全一樣。閱讀文檔中的矢量算術:https://cran.r-project.org/doc/manuals/r-release/R-intro.html#Vector-arithmetic –

0

正如lmo所說,您想要使用seq_along(latitude)1:length(latitude),它將返回索引而不是latitude中的實際元素。

此外,您可能需要仔細檢查latitude[y+1]是否正確。當前語法假定數據中緯度值的順序從最新到最舊。根據您提供的信息無法知道這是否正確,但可能是相反的。如弗蘭克指出的,你正在一個循環中增加你的向量,這是不好的做法(因爲它不能很好地縮放,對於大對象變得很慢)。 Nathan Werth的答案提出了一個矢量化的實現。

+0

除了邏輯錯誤,OP也在循環中增加某些東西,在R中不好的做法;請參閱http://www.burns-stat.com/documents/books/the-r-inferno/的第2章。指向MCVE很好,但我不認爲它屬於答案。作爲評論更好。既然你不能在OP下發表評論,我會在你自己的回答下把它作爲評論。 – Frank

+1

我認爲提交代碼的漸進式改進對提交者@Frank很有用。話雖如此,我同意在一個循環中增加矢量是不好的做法(當處理大的矢量時變得非常清晰),更好的答案將包括改進的代碼。自矢量化的替代品已發佈後,我正在編輯我的答案,建議一個。我也正在將MCVE的建議發表評論。 – Luis

+1

包含足夠的代碼來重現問題會很有幫助。請參閱創建[最小,完整和可驗證示例]的指導原則(https://stackoverflow.com/help/mcve)。 – Luis