gpt4 book ai didi

r - 如何将函数应用于 data.frame 的每个元素?

转载 作者:行者123 更新时间:2023-12-04 10:37:32 25 4
gpt4 key购买 nike

我想将一个数值转换为一个因子,如果该值低于 -2,则“向下”应该是因子,如果它高于 2,则“向上”和“no_change”之间:

到目前为止,我想过创建一个函数:

classifier <- function(x){
if (x >= 2){
return(as.factor("up"))
}else if (x <= -2){
return(as.factor("down"))
}else {
return(as.factor("no_change"))
}
}

我可以让它在输入上迭代(使用 for 循环)并返回一个列表,所以我可以将它与 apply 一起使用。

我想将此功能应用于 所有单元格 的data.frame,我该怎么做?

模拟数据( runif(15, min=-5, max=5) ):
c(1.11004611710086, -1.86842617811635, 1.72159335808828, -2.68788822228089, 
2.72551498375833, 3.67290901951492, -4.00984475389123, -2.39582793787122,
4.22395745059475, -0.360892189200968, 1.35027756914496, 2.89919016882777,
-0.158692332915962, -0.950306688901037, 3.39141107397154)

最佳答案

使用 DF <- iris[-5]作为示例数据,您可以使用 cut ,正如我在评论中建议的那样。

尝试:

DF[] <- lapply(DF, cut, c(-Inf, -2, 2, Inf), c("down", "no_change", "up"))

head(DF)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 up up no_change no_change
## 2 up up no_change no_change
## 3 up up no_change no_change
## 4 up up no_change no_change
## 5 up up no_change no_change
## 6 up up no_change no_change

tail(DF)
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## 145 up up up up
## 146 up up up up
## 147 up up up no_change
## 148 up up up no_change
## 149 up up up up
## 150 up up up no_change

或者,使用 RHertel 的“mock_data”:
cut(mock_data, c(-Inf, -2, 2, Inf), c("down", "no_change", "up"))
## [1] no_change no_change no_change down up up down
## [8] down up no_change no_change up no_change no_change
## [15] up
## Levels: down no_change up

基准

正如我在评论中所建议的,RHertel 的方法可能是最有效的。该方法使用非常简单的子集化(速度很快)和 factor (这通常也很快)。

在您描述的大小的数据上,您肯定会注意到差异:
set.seed(1)
nrow = 20000
ncol = 1000
x <- as.data.frame(matrix(runif(nrow * ncol, min=-5, max=5), ncol = ncol))

factorize <- function(invec) {
factorized <- rep("no_change", length(invec))
factorized[invec > 2] <- "up"
factorized[invec < -2] <- "down"
factor(factorized, c("down", "no_change", "up"))
}

RHfun <- function(indf = x) {
indf[] <- lapply(indf, factorize)
indf
}

AMfun <- function(DF = x) {
DF[] <- lapply(DF, cut, c(-Inf, -2, 2, Inf), c("down", "no_change", "up"))
DF
}

library(microbenchmark)
microbenchmark(AMfun(), RHfun(), times = 10)
# Unit: seconds
# expr min lq mean median uq max neval
# AMfun() 7.501814 8.015532 8.852863 8.731638 9.660191 10.198983 10
# RHfun() 1.437696 1.485791 1.723402 1.574507 1.637139 2.528574 10

关于r - 如何将函数应用于 data.frame 的每个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35337635/

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