Если вы действительно хотите, чтобы уровни коэффициента использовались, вы либо делаете что-то очень неправильное, либо слишком умное для собственной пользы.
Если у вас есть фактор, содержащий числа, хранящиеся вуровни фактора, затем вы хотите сначала привести его к числовому значению, используя as.numeric(as.character(...))
:
dat <- data.frame(f=as.character(runif(10)))
Вы можете увидеть разницу между доступом к индексам фактора и назначением содержимого фактора здесь:
> as.numeric(dat$f)
[1] 9 7 2 1 4 6 5 3 10 8
> as.numeric(as.character(dat$f))
[1] 0.6369432 0.4455214 0.1204000 0.0336245 0.2731787 0.4219241 0.2910194
[8] 0.1868443 0.9443593 0.5784658
Сроки и альтернативный подход, который только делает преобразование на уровнях, показывает, что быстрее, если уровни не уникальны для каждого элемента:
dat <- data.frame( f = sample(as.character(runif(10)),10^4,replace=TRUE) )
library(microbenchmark)
microbenchmark(
as.numeric(as.character(dat$f)),
as.numeric( levels(dat$f) )[dat$f] ,
as.numeric( levels(dat$f)[dat$f] ),
times=50
)
expr min lq median uq max
1 as.numeric(as.character(dat$f)) 7835865 7869228 7919699 7998399 9576694
2 as.numeric(levels(dat$f))[dat$f] 237814 242947 255778 270321 371263
3 as.numeric(levels(dat$f)[dat$f]) 7817045 7905156 7964610 8121583 9297819
Поэтому, если length(levels(dat$f)) < length(dat$f)
, используйте as.numeric(levels(dat$f))[dat$f]
для существенного прироста скорости.
Если length(levels(dat$f))
приблизительно равен length(dat$f)
, прирост скорости отсутствует:
dat <- data.frame( f = as.character(runif(10^4) ) )
library(microbenchmark)
microbenchmark(
as.numeric(as.character(dat$f)),
as.numeric( levels(dat$f) )[dat$f] ,
as.numeric( levels(dat$f)[dat$f] ),
times=50
)
expr min lq median uq max
1 as.numeric(as.character(dat$f)) 7986423 8036895 8101480 8202850 12522842
2 as.numeric(levels(dat$f))[dat$f] 7815335 7866661 7949640 8102764 15809456
3 as.numeric(levels(dat$f)[dat$f]) 7989845 8040316 8122012 8330312 10420161