什么是逐行操作data.frame中的一列的更快的方法?

时间:2012-11-02 08:51:30

标签: r dataframe

我有一个数据纬度和经度值的数据框。 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上运行此代码块大约需要一分钟,也许两分钟 - 比我预期的要长得多。似乎有些事情使得效率非常低,应该有更好的方法。任何提示?

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

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

给出一些示例数据:

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

@James在他的答案中做的那种事情只是为了比较latitude > 0,它返回一个逻辑向量并将1添加到此(所以我们有一个{{1的数字向量) }}和1 s。然后使用它来索引可能性2的向量。

c("South","North")

哪个给出了

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