2014-02-23 47 views
1

我想遍歷屬性表(例如INPUT),確定存在交互的最小距離,然後將該距離加上FID寫入新表(例如OUTPUT)。爲簡單起見,我已將ArcGIS中的屬性表導出爲.csv。如何遍歷shapefile屬性表並將結果寫入R中的新.csv表?

下面是一些簡化的示例數據 http://i.imgur.com/blDQfVS.png

例如,對於FID 001沒有相互作用,002的相互作用是在5000米,對於003有以2000m的相互作用,以及用於004那裏是0米處的相互作用。

我有邏輯想通了,但我很難寫輸出到表。這就是我來了這麼遠(我只是用打印這裏爲了排除故障):

# Process rows and determine the minimum zone of influence 
for (i in 1:nrow(INPUT)){ 
    ifelse(INPUT$BUFFER_0k[i]>0, print("0"), 
     ifelse(INPUT$BUFFER_2k[i]>0, print("2000"), 
       ifelse(INPUT$BUFFER_5k[i]>0, print("5000"), print("NA")))) 

我已經試過的東西更換打印像

csvFile="C:\\...\\output.csv" 
write.csv(c(INPUT$FID[i], "0"), file=csvFile, append=TRUE) 

,我甚至不能像下面的工作,以取代簡單的打印聲明

print(c(INPUT$FID[i]>0, "0")) 

我欣賞任何建議。

+0

邏輯不清楚給我。你如何確定交互的地方? –

+0

如果該值大於0,則兩個要素已相交,並且相交要素的FID將被存儲而不是0. – user3343890

+0

這不是您的示例輸出顯示的內容。它顯示了一些相交距離,它顯示它們爲*每個* FID(雖然是的,它可能是NA)。我的問題是:你如何計算這些距離? –

回答

1

你的代碼使用print,它立即打印值 - 這不是你想要的。你想單獨(a)計算結果和(b)將結果表寫入一個文件。

首先,這裏是轉變一個單行的函數:

get_dist = function (row) { 
    index = which(row > 0)[1] 
    if (is.na(index)) NA else switch(index, 0, 2000, 5000) 
} 

它通過尋找這是> 0,如果有第一個索引。 switch將該索引轉換爲距離。

現在我們應用(直譯)的功能,輸入矩陣:

result = apply(input, 1, get_dist) 

但是,這一結果實際上是一個向量:

result 
# 001 002 003 004 
# NA 5000 2000 0 

- 我們希望有一個矩陣或數據幀:

result = data.frame(distance = result) 
result 
#  distance 
# 001  NA 
# 002  5000 
# 003  2000 
# 004  0 

現在我們可以把它寫到一個文件中:

write.csv(result, csv_file, append = TRUE) 
+0

感謝您的幫助,但我遇到了問題> result = data.frame(distance = result) data.frame('1' = 0,'2' = 0,3 '= 0,'4' = 0,'5' = 0,'6' = 0,: 參數意味着行數不同:1,0 – user3343890

+0

在執行該語句之前,''result'看起來像什麼?輸入你已經顯示,我得到的輸出顯示在我的答案中,任何其他意味着你的輸入格式略有不同,請注意'get_dist'依賴於你的輸入只有三列的事實 –

+0

啊,我明白了!實際上,我的唯一標識符(示例表中的FID)將是字母和數字(02034,mf-302,...)的組合,而不是1,2,3。是否可以將它包含在輸出?還有,在index = which(row> 0)[1]中[1]的作用是什麼? – user3343890