R向量化重复循环
我有一个函数,其中的标准是使用R向量化重复循环,r,dplyr,R,Dplyr,我有一个函数,其中的标准是使用repeat循环来计算答案,我在为此编写“矢量化”函数时遇到了问题。当我在一行代码中调用该函数时,它就会工作;但是,当我将它放入带有mutate的数据帧时,它会给出一个错误,因为只使用了第一个值。我可以通过按行使用来解决这个问题,但是这可能不是最好的方法 如何重写repeat循环以使用mutate?下面是该函数的一个示例 mean_estimate <- function(x, y) { mean <- (x + y) / 2 out <-
repeat
循环来计算答案,我在为此编写“矢量化”函数时遇到了问题。当我在一行代码中调用该函数时,它就会工作;但是,当我将它放入带有mutate
的数据帧时,它会给出一个错误,因为只使用了第一个值。我可以通过按行使用来解决这个问题,但是这可能不是最好的方法
如何重写repeat
循环以使用mutate
?下面是该函数的一个示例
mean_estimate <- function(x, y) {
mean <- (x + y) / 2
out <- x
repeat{
out <- out + 0.1
if (out >= mean) {
break
}
}
return(out)
}
# Check function for simple numbers
mean_estimate(100, 200)
# Check function for vectors
mean_estimate(seq(100, 200, 20), seq(200, 300, 20))
# Check function for data frame
df <- data_frame(
var1 = runif(10, min = 120, max = 150),
var2 = runif(10, min = 220, max = 250)
)
wrong <- df %>%
mutate(wrong = mean_estimate(var1, var2))
right <- df %>%
rowwise() %>%
mutate(right = mean_estimate(var1, var2))
comb <- wrong %>%
left_join(right, by = c("var1", "var2")) %>%
mutate(error = wrong - right)
mean_estimate我们可以使用map2
,它比rowwise
library(tidyverse)
df %>%
mutate(right = map2_dbl(var1, var2, mean_estimate))
我们可以使用map2
,它比rowwise
library(tidyverse)
df %>%
mutate(right = map2_dbl(var1, var2, mean_estimate))
这是一个没有循环的矢量化函数:
mean_estimate_vec <- function(x, y) {
x + floor(((x + y) / 2 - x + 0.1) * 10) / 10
}
df <- data.frame(
var1 = runif(10, min = 120, max = 150),
var2 = runif(10, min = 220, max = 250)
)
all.equal(
#your function:
apply(df, 1, function(z) mean_estimate(z[1], z[2])),
#vectorized:
with(df, mean_estimate_vec(var1, var2))
)
#[1] TRUE
mean\u estimate\u vec这是一个没有循环的向量化函数:
mean_estimate_vec <- function(x, y) {
x + floor(((x + y) / 2 - x + 0.1) * 10) / 10
}
df <- data.frame(
var1 = runif(10, min = 120, max = 150),
var2 = runif(10, min = 220, max = 250)
)
all.equal(
#your function:
apply(df, 1, function(z) mean_estimate(z[1], z[2])),
#vectorized:
with(df, mean_estimate_vec(var1, var2))
)
#[1] TRUE
mean\u estimate\u vec感谢您的努力!非常感谢。我想我要寻找的是一种重写函数以避免重复语句的方法,但由于这不是实际的代码,因此这一定是一个糟糕的问题,很难回答!谢谢你的努力!非常感谢。我想我要寻找的是一种重写函数以避免重复语句的方法,但由于这不是实际的代码,因此这一定是一个糟糕的问题,很难回答!谢谢你的努力!我正在试着看看如何将它应用到实际代码中!谢谢你的努力!我正在试着看看如何将它应用到实际代码中!