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