gpt4 book ai didi

r - R 因子的算术运算

转载 作者:行者123 更新时间:2023-12-04 09:04:26 26 4
gpt4 key购买 nike

我有一个 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

关于r - R 因子的算术运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6979625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com