2012-03-13 79 views
2

我有一些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中的循環是一個標誌,你不知道你在做什麼,但是替代方案的學習曲線似乎很陡峭。這也是爲什麼腳本需要很長時間才能運行,即使是在一臺快速機器上也是如此。

+0

有幾件事可以幫助你在「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

+0

行號是您最擔心的問題。他們只是R試圖讓被要求做一些有點荒謬的事情的結果。重點關注蔡斯的建議:_不要種植物體_預分配。向量化你所能做的一切。 – joran 2012-03-13 03:27:47

+0

我輸入的計算結果只是佔位符。實際的計算有點複雜。每個記錄都有一個緯度。我需要計算每個點和下一個點之間的方位。我還必須找出以該點爲中心的矩形的角點的經緯度,但與軸承對齊。我必須將這些矩形轉換爲多邊形,以便將它們導出到arcGIS。 – RyanN 2012-03-13 18:27:25

回答

3

問題是R的工作原理與其他編程語言不同。使用循環通常不是很快。而是使用使R易於使用(但與其他語言不同)的矢量化。因此,對於你的問題我可能會做的事:

i=1:5 
data.frame(param1 = i * 1.1, param2 = i * 5.3, param3 = i*2+9) 

還檢查了applylapplysapplyifelse等還注意到,許多功能是矢量和矢量容易的工作。

如果你真的想修復了你,你可以使用以下內容:

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 = 2*i+9 
    # Now append these calculated values to some sort of object 
    sample = list(param1=param1,param2=param2,param3=param3) 
    result <- data.frame(rbind(result,sample)) 
    rownames(result) <- 1:nrow(result) 
} 
print(result) 
2

注意以下

row.names(result) <- 1:nrow(result) 
result 

i <- 1:5 
i * 5.3 
i 

的結果正如你可以看到... ...在R寫入不像你使用Python的方式,儘管它可以像numpy。它具有與numpy類似的屬性,因爲向量上的數學命令會自動傳播到所有的數學命令。它也像numpy一樣,這不適用於一切。