R Apply函数取决于向量中的元素

时间:2014-08-06 18:39:50

标签: r switch-statement

如何选择一个函数,具体取决于向量中的元素?

E.g。向量(a,b,a,b,b)

元素a => x + 2
元素b => y * 3

我正在考虑转换声明,但不知道这是否是好的R风格。

2 个答案:

答案 0 :(得分:3)

如果您想使用switch进行此操作,可能会采用

的方式

定义switch函数

Myswitch <- function(x, type) {
  switch(type,
         "a" = x + 2,
         "b" = x * 3)
}

创建一些数据

set.seed(123)
x <- sample(10, 5) 
x
## [1] 3 8 4 7 6

你的开关矢量

vec <- c("a","b","a","b","b") 

使用sapply

对函数进行矢量化实现
sapply(vec, function(y) Myswitch(x, y)) 

#       a  b  a  b  b
# [1,]  5  9  5  9  9
# [2,] 10 24 10 24 24
# [3,]  6 12  6 12 12
# [4,]  9 21  9 21 21
# [5,]  8 18  8 18 18

如果您想在每个条目中使用它(而不是一次只使用整个x),请改用mapply

mapply(Myswitch, x, vec)
## [1]  5 24  6 21 18

答案 1 :(得分:0)

我不知道如何添加或乘以一个字符元素,但这可能会让你开始。

set.seed(42)
vec1 = c('a','b','a','b','b')
vec2 = runif(length(vec1))

vec3 = sapply(1:length(vec1), function(x){
  if (vec1[x] == 'a'){
    vec2[x] + 3
  }else{
    vec2[x] * 3
  }
})

修改:更快捷的方式:

vec3 = ifelse(vec1=='a',vec2 + 3, vec2 * 3)