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 で約 1 分、場合によっては 2 分かかります。予想よりもはるかに長くなります。何かが非常に非効率的であり、より良い方法があるはずです。ヒントはありますか?

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 が彼の Answer で行うことの私のバージョンは、latitude > 0どちらが論理ベクトルを返し、これに追加するかを比較することです (したがって、 s とs の1数値ベクトルがあります。次に、それを使用して、可能性のベクトルにインデックスを付けます。12c("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 に答える