我有一个函数,其中的标准是使用repeat
循环来计算答案,为此编写“矢量化”函数时遇到了问题。当我在一行代码中调用该函数时,该函数起作用;但是,当我将它与data frame
一起放在mutate
中时,由于仅使用第一个值,因此会出现错误。我可以使用rowwise
来解决这个问题,但这可能不是最好的方法。
如何重写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)
答案 0 :(得分:2)
我们可以使用比map2
更快的rowwise
library(tidyverse)
df %>%
mutate(right = map2_dbl(var1, var2, mean_estimate))
答案 1 :(得分:1)
这是一个没有循环的矢量化函数:
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
对不起,我不想安装tidyverse。因此,此答案中只有基本函数。