为了账号安全,请及时绑定邮箱和手机立即绑定

如何在不丢失信息的情况下将因子转换为整数\数字?

如何在不丢失信息的情况下将因子转换为整数\数字?

慕雪6442864 2019-05-23 11:16:04
如何在不丢失信息的情况下将因子转换为整数\数字?当我将因子转换为数字或整数时,我得到基础级别代码,而不是值作为数字。f <- factor(sample(runif(5), 20, replace = TRUE))##  [1] 0.0248644019011408 0.0248644019011408 0.179684827337041 ##  [4] 0.0284090070053935 0.363644931698218  0.363644931698218 ##  [7] 0.179684827337041  0.249704354675487  0.249704354675487 ## [10] 0.0248644019011408 0.249704354675487  0.0284090070053935## [13] 0.179684827337041  0.0248644019011408 0.179684827337041 ## [16] 0.363644931698218  0.249704354675487  0.363644931698218 ## [19] 0.179684827337041  0.0284090070053935## 5 Levels: 0.0248644019011408 0.0284090070053935 ... 0.363644931698218as.numeric(f)##  [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2as.integer(f)##  [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2我不得不求助于paste获得真正的价值观:as.numeric(paste(f))##  [1] 0.02486440 0.02486440 0.17968483 0.02840901 0.36364493 0.36364493##  [7] 0.17968483 0.24970435 0.24970435 0.02486440 0.24970435 0.02840901## [13] 0.17968483 0.02486440 0.17968483 0.36364493 0.24970435 0.36364493## [19] 0.17968483 0.02840901有没有更好的方法将因子转换为数字?
查看完整描述

3 回答

?
牧羊人nacy

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


查看完整回答
反对 回复 2019-05-23
?
qq_花开花谢_0

TA贡献1835条经验 获得超6个赞

R有许多(未记录的)便利函数用于转换因子:

  • as.character.factor

  • as.data.frame.factor

  • as.Date.factor

  • as.list.factor

  • as.vector.factor

  • ...

但令人讨厌的是,没有什么可以处理因素 - >数字转换。作为约书亚乌尔里希答案的延伸,我建议用你自己惯用函数的定义来克服这个遗漏:

as.numeric.factor <- function(x) {as.numeric(levels(x))[x]}

您可以存储在脚本的开头,甚至可以存储在.Rprofile文件中。


查看完整回答
反对 回复 2019-05-23
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

最简单的方法是使用unfactorpackage 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"


查看完整回答
反对 回复 2019-05-23
  • 3 回答
  • 0 关注
  • 822 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信