R因子的算术运算
我有一个R数据框,我试图从另一列中减去一列。 我使用$
运算符提取列,但列的类是'因子',R不会对因子执行算术运算。 是否有特殊的功能来做到这一点?
如果你真的想要使用这个因子的水平,那么你要么为了自己的利益而做一些非常错误的事情或者太巧妙。
如果你所拥有的是一个包含存储在因子水平中的数字的因子,那么你首先要使用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
你可以定义你自己的操作员来做到这一点,看看? Arith
? Arith
。 没有组泛型,你可以定义你自己的二元运算符%operator%:
%-% <- function (factor1, factor2){
# put in the code here to calculate difference
# of two factors (e.g. facor1 level cat - factor2 level mouse = ?)
}
你应该仔细检查一下你是如何拉动数据的。 如果这些是真正的数字列,R应该认识到这一点(Excel有时候会弄错)。 无论哪种方式,它都可能被强迫为一个因素,因为列中还有其他不受欢迎的人。 迄今为止收到的回复没有提到as.numeric()只返回关卡号码。 这意味着您将不会对已转换为因素的实际数字执行操作,而是会对与每个因素关联的级别数字执行操作。
链接地址: http://www.djcxy.com/p/24937.html上一篇: Arithmetic operations on R factors
下一篇: Plot 3 categorical variables with dependencies on previous column