2

我有一个带有数字纬度和经度值的数据框。data.frame 有 14K 行和 40 列。

我想在数据框中添加一个名为“半球”的类别列,以便轻松区分北部(纬度 > 0)和南部位置(纬度 < 0)。这就是我所做的:

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

在我的 MacBook Pro 上运行这个代码块大约需要一分钟,也许两分钟——比我预期的要长得多。似乎有些东西使它效率很低,应该有更好的方法。有什么提示吗?

4

2 回答 2

4

@baptiste 的ifelse解决方案是加快与矢量化比较的一般习惯用法,但在这种情况下,一些明智的子集和使用sign可能会更快:

myDataFrame$hemisphere <- c("South","Equator","North")[sign(myDataFrame$latitude)+2]
于 2012-11-02T09:09:01.753 回答
3

ifelse很快,但如果需要效率,您可能最好使用基于子集的方法。

给定一些示例数据:

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

我对@James 在他的答案中所做的事情的版本只是比较latitude > 0哪个返回一个逻辑向量并添加1到这个(所以我们有一个1s 和2s 的数字向量。然后用它来索引可能性向量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
于 2012-11-02T09:28:36.753 回答