使用提供的变量矢量化函数

时间:2016-07-22 12:02:52

标签: r vectorization

我有一个功能我一直试图从if(){}ifelse()进行矢量化。当函数的所有参数都包含在它正在处理的数据集中时,它工作正常,但如果我提供一个参数作为字符串,则向量化停止,第一个结果用于整个数据集。

这是一个例子

# data
dat <- data.frame(var1 = rep(c(0,1), 4), 
                  var2 = c(rep("a", 4), rep("b", 4))
                  )

# function
my_fun <- function(x, y){
  z <- ifelse(y == "a", fun_a(x), fun_b(x))
  return(z)
}

fun_a <- function(x){
  z <- ifelse(x == 0, "zero", x)
  return(z)
}

fun_b <- function(x){
  z <- ifelse(x == 1, "ONE", x)
  return(z)
}
dat$var3 <- my_fun(dat$var1, dat$var2)

这将返回我所期望的,一个具有基于var1和var2

的行方式值的向量
> dat
  var1 var2 var3
1    0    a zero
2    1    a    1
3    0    a zero
4    1    a    1
5    0    b    0
6    1    b  ONE
7    0    b    0
8    1    b  ONE

但是,我想在不包含var2的不同数据集上使用此函数。我意识到一个简单的方法是将var2添加为数据集中的额外列,但我并不是真的想要这样做。

当我将var2作为字符串提供时会发生这种情况:

other_dat <- data.frame(var1 = rep(c(0,1), 4))
other_dat$var3 <- my_fun(other_dat$var1, y = "a")
other_dat
  var1 var3
1    0 zero
2    1 zero
3    0 zero
4    1 zero
5    0 zero
6    1 zero
7    0 zero
8    1 zero

如何对此函数进行矢量化以使其接受字符串参数并返回我想要的结果?

1 个答案:

答案 0 :(得分:1)

你可以矢量化y,即使y的长度与x相似,然后ifelse将在所有值上应用函数my_func。修改后的代码:

# data
dat <- data.frame(var1 = rep(c(0,1), 4), 
                  var2 = c(rep("a", 4), rep("b", 4))
                  )

# function
my_fun <- function(x, y){
  if(length(y) == 1) {
    y <- rep(y, length(x))
  }
  z <- ifelse(y == "a", fun_a(x), fun_b(x))
  return(z)
}

fun_a <- function(x){
  z <- ifelse(x == 0, "zero", x)
  return(z)
}

fun_b <- function(x){
  z <- ifelse(x == 1, "ONE", x)
  return(z)
}
dat$var3 <- my_fun(dat$var1, "a")

other_dat <- data.frame(var1 = rep(c(0,1), 4))
other_dat$var3 <- my_fun(other_dat$var1, y = "a")
other_dat

希望这有帮助。