3 回答

TA貢獻1862條經驗 獲得超7個贊
請參閱以下警告部分?factor
:
特別是,
as.numeric
應用于一個因素是沒有意義的,并且可能通過隱式強制發生。要將因子轉換f
為大約其原始數值,as.numeric(levels(f))[f]
建議使用效率稍高一些as.numeric(as.character(f))
。
關于R的FAQ 有類似的建議。
為什么as.numeric(levels(f))[f]
比這更有效as.numeric(as.character(f))
?
as.numeric(as.character(f))
是有效的as.numeric(levels(f)[f])
,因此您正在執行轉換為數字length(x)
值而不是nlevels(x)
值。對于具有較少水平的長向量,速度差異將是最明顯的。如果這些值大多是唯一的,那么速度就沒有太大差異。但是,如果進行轉換,此操作不太可能成為代碼中的瓶頸,因此不要過于擔心。
一些時間
library(microbenchmark)
microbenchmark(
as.numeric(levels(f))[f],
as.numeric(levels(f)[f]),
as.numeric(as.character(f)),
paste0(x),
paste(x),
times = 1e5
)
## Unit: microseconds
## expr min lq mean median uq max neval
## as.numeric(levels(f))[f] 3.982 5.120 6.088624 5.405 5.974 1981.418 1e+05
## as.numeric(levels(f)[f]) 5.973 7.111 8.352032 7.396 8.250 4256.380 1e+05
## as.numeric(as.character(f)) 6.827 8.249 9.628264 8.534 9.671 1983.694 1e+05
## paste0(x) 7.964 9.387 11.026351 9.956 10.810 2911.257 1e+05
## paste(x) 7.965 9.387 11.127308 9.956 11.093 2419.458 1e+05

TA貢獻1848條經驗 獲得超2個贊
最簡單的方法是使用unfactor
package varhandle中的函數
unfactor(your_factor_variable)
這個例子可以快速入門:
x <- rep(c("a", "b", "c"), 20)
y <- rep(c(1, 1, 0), 20)
class(x) # -> "character"
class(y) # -> "numeric"
x <- factor(x)
y <- factor(y)
class(x) # -> "factor"
class(y) # -> "factor"
library(varhandle)
x <- unfactor(x)
y <- unfactor(y)
class(x) # -> "character"
class(y) # -> "numeric"
- 3 回答
- 0 關注
- 987 瀏覽
添加回答
舉報