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感谢您的努力!非常感谢。我想我要寻找的是一种重写函数以避免重复语句的方法,但由于这不是实际的代码,因此这一定是一个糟糕的问题,很难回答!谢谢你的努力!非常感谢。我想我要寻找的是一种重写函数以避免重复语句的方法,但由于这不是实际的代码,因此这一定是一个糟糕的问题,很难回答!谢谢你的努力!我正在试着看看如何将它应用到实际代码中!谢谢你的努力!我正在试着看看如何将它应用到实际代码中!