R向量化重复循环

时间:2018-07-12 15:49:14

标签: r dplyr

我有一个函数,其中的标准是使用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)

2 个答案:

答案 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。因此,此答案中只有基本函数。