2012-11-02 26 views
2

我有一個數據框與數字緯度和經度值。 data.frame有14K行和40列。什麼是更快的方式來逐行操作data.frame中的一列?

我想在數據框中添加一個名爲「hemisphere」的類別列,以便輕鬆區分北部(緯度> 0)和南部位置(緯度< 0)。這是我做的:

for (r in 1:nrow(myDataFrame)) { 
    if (myDataFrame[r, "latitude"] > 0) { 
    myDataFrame[r, "hemisphere"] <- "North" 
    } else { 
    myDataFrame[r, "hemisphere"] <- "South" 
    } 
} 

運行這段代碼塊需要大約一分鐘,也許兩個,在我的MacBook Pro - 更長的時間比我期望。看起來好像有些東西使它效率很低,應該有更好的方法。任何提示?

+6

myDataFrame = transform(myDataFrame,hemisphere = ifelse(latitude> 0,「North」,「South」))'? – baptiste

+0

@baptiste是的,那真的很快。謝謝!爲什麼不把它作爲一個真正的答案? – Marian

回答

4

@巴蒂斯特的ifelse的解決方案是加快與矢量化比較一般的成語,但在這種情況下,一些明智的子集和使用sign可能會更快:

myDataFrame$hemisphere <- c("South","Equator","North")[sign(myDataFrame$latitude)+2] 
3

ifelse快,但如果效率要求你使用基於子集的方法可能會更好。

鑑於一些示例數據:

set.seed(1) 
df <- data.frame(site = 1:14000, latitude = rnorm(14000)) 

我之類的事情的版本@詹姆斯確實在他的回答只是比較latitude > 0它返回一個邏輯向量,並添加1這個(所以我們有一個數字的1 S和2小號載體,然後用它來索引的可能性c("South","North")的載體。

df$hemisphere <- c("South","North")[(df$latitude > 0) + 1] 

其中給出

> head(df) 
    site latitude hemisphere 
1 1 -0.6264538  South 
2 2 0.1836433  North 
3 3 -0.8356286  South 
4 4 1.5952808  North 
5 5 0.3295078  North 
6 6 -0.8204684  South 
+1

我認爲半球是錯誤的方式... – James

+0

@James謝謝你。非常尷尬,我是一名地理學家和所有人。大腦在那裏失敗。現在修復。 –

+0

可以說這是一個地磁逆轉 – James

相關問題