3 回答

TA貢獻1862條經(jīng)驗 獲得超7個贊
請參閱以下警告部分?factor
:
特別是,
as.numeric
應用于一個因素是沒有意義的,并且可能通過隱式強制發(fā)生。要將因子轉換f
為大約其原始數(shù)值,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])
,因此您正在執(zhí)行轉換為數(shù)字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貢獻1835條經(jīng)驗 獲得超7個贊
R有許多(未記錄的)便利函數(shù)用于轉換因子:
as.character.factor
as.data.frame.factor
as.Date.factor
as.list.factor
as.vector.factor
...
但令人討厭的是,沒有什么可以處理因素 - >數(shù)字轉換。作為約書亞烏爾里希答案的延伸,我建議用你自己慣用函數(shù)的定義來克服這個遺漏:
as.numeric.factor <- function(x) {as.numeric(levels(x))[x]}
您可以存儲在腳本的開頭,甚至可以存儲在.Rprofile
文件中。

TA貢獻1848條經(jīng)驗 獲得超2個贊
最簡單的方法是使用unfactor
package varhandle中的函數(shù)
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 關注
- 942 瀏覽
添加回答
舉報