4

私はデータフレームを持っています:

id <- c(rep(1, 4), rep(2, 3), rep(3, 2), 4)
rate <- c(rep(1, 3), NA, 0.5, 0.6, NA, 0.7, NA, NA)
df <- data.frame(id, rate)

NA次の条件に基づいてを置き換える必要があります。

for (i in 1:dim(df)[1]) {
  if (is.na(df$rate[i])) {
    mrate <- round(mean(df$rate[df$id == df$id[i]], na.rm = T), 1)
    if (is.nan(mrate)) {
      df$rate[i] <- 1
    } else {
      df$rate[i] <- mrate
    }
  }
}

どうやら、for200K 行を超える大きなデータ フレームではループが遅すぎるようです。forループを使用せずに、より高速な方法を使用するにはどうすればよいですか?

ありがとう!

4

3 に答える 3

5

これはsを使用したソリューションdata.tableです:

library(data.table)
dt <- data.table( df, key = "id" )
dt[ , rate := ifelse( is.na(rate), round( mean(rate, na.rm=TRUE), 1), rate ), by = id ]
dt[ is.na(rate), rate := 1 ]
dt 
    id rate
 1:  1  1.0
 2:  1  1.0
 3:  1  1.0
 4:  1  1.0
 5:  2  0.5
 6:  2  0.6
 7:  2  0.6
 8:  3  0.7
 9:  3  0.7
10:  4  1.0

ifelseただし、回避できる/回避する必要があるかどうかはわかりません。

于 2013-05-22T15:01:32.530 に答える