我有一些python和numpy的經驗,但從未使用R之前。我試圖幫助我的妻子開展她的R項目,因爲雖然她對統計數據有更好的掌握,但她沒有什麼編程經驗。我發現R的語法和文檔非常混亂。列表,data.frame循環和索引問題
我們想要做的最初的事情是通過一個大型data.frame循環,執行一系列空間計算,包括之前和之後的記錄,對數據進行一點觸發和一些質量檢查,並用數據生成一個新對象。然後,我們將得到這個新的數據到GIS
編輯: 只要是明確的,在這個例子中的計算只是一個佔位符,並沒有像我所需要的實際計算。
起初我想是這樣的:
> result = list()
> for (i in 1:5) {
+ #Calculate some dummy data. The actual calculations are much more involved
+ param1 = i * 1.1
+ param2 = i * 5.3
+ param3 = i + a_value
+ # Now append these calculated values to some sort of object
+ sample = list(param1=param1,param2=param2,param3=param3)
+ result <- rbind(result,sample)
+ }
> print(result)
param1 param2 param3
sample 1.1 5.3 12
sample 2.2 10.6 13
sample 3.3 15.9 14
sample 4.4 21.2 15
sample 5.5 26.5 16
的「樣本」列似乎非必要,但哦,看起來不錯。我們引用單個列...
> result$param2
NULL
???我試圖通過越來越擺脫「樣本」的:
+ result <- rbind(result,list(param1=param1,param2=param2,param3=param3))
>
param1 param2 param3
[1,] 1.1 5.3 12
[2,] 2.2 10.6 13
[3,] 3.3 15.9 14
[4,] 4.4 21.2 15
[5,] 5.5 26.5 16
> result$param2
NULL
也許這個數據幀的事情會工作。我改變了第一行爲:
result = data.frame()
>
param1 param2 param3
2 1.1 5.3 12
21 2.2 10.6 13
3 3.3 15.9 14
4 4.4 21.2 15
5 5.5 26.5 16
> result$param2 # One column
[1] 5.3 10.6 15.9 21.2 26.5
> result[2,] #One row
param1 param2 param3
21 2.2 10.6 13
> result[3,]$param3 # Single value
[1] 14
所以它的工作,但我不知道21(行號?)是關於什麼。如果我有更多的行,第21行是'211'。
有人能告訴我爲什麼第一個案件不起作用,'21'是什麼,以及是否有更好的方法來做到這一點。我讀過的大部分內容都表明,R中的循環是一個標誌,你不知道你在做什麼,但是替代方案的學習曲線似乎很陡峭。這也是爲什麼腳本需要很長時間才能運行,即使是在一臺快速機器上也是如此。
有幾件事可以幫助你在「R」中思考。 1)在向量中思考。大多數情況下,你不需要一個明確的循環來完成上面的任務。例如,你的簡單添加可以像這樣完成'> 1:5 + 1.1 [1] 2.1 3.1 4.1 5.1 6.1'。這是一個關於矢量化的文章:http://shape-of-code.coding-guidelines.com/2010/09/04/thinking-in-r-vectors/。 2)搜索「preallocate」http://stackoverflow.com/questions/4034059/iteratively-constructed-dataframe-in-rx。你看到的奇數行數是你正在進行的'rbind()'的愚蠢副產品。不必要! – Chase 2012-03-13 03:05:03
行號是您最擔心的問題。他們只是R試圖讓被要求做一些有點荒謬的事情的結果。重點關注蔡斯的建議:_不要種植物體_預分配。向量化你所能做的一切。 – joran 2012-03-13 03:27:47
我輸入的計算結果只是佔位符。實際的計算有點複雜。每個記錄都有一個緯度。我需要計算每個點和下一個點之間的方位。我還必須找出以該點爲中心的矩形的角點的經緯度,但與軸承對齊。我必須將這些矩形轉換爲多邊形,以便將它們導出到arcGIS。 – RyanN 2012-03-13 18:27:25