如何将函数应用于R中向量的每个元素

时间:2013-01-08 00:28:31

标签: r vector apply

假设我想将向量的每个偶数元素乘以2,将向量的每个奇数元素乘以3.以下是一些可以执行此操作的代码:

v <- 0:10

idx <- v %% 2 == 0
v[idx] <- v[idx] * 2
v[!idx] <- v[!idx] * 3

如果我有两个以上的案例,这将变得困难。看起来应用函数系列从不处理向量,所以我不知道更好的方法来解决这个问题。如果我对数据进行了转换,也许使用apply函数会有效,但似乎不应该是我需要做的事情来解决这个简单的问题。

有什么想法吗?

编辑:抱歉让您感到困惑。我对“%%”运算符并不特别感兴趣。我想在我的问题中提出一些具体的代码,但是,根据对问题的回答,这个代码太具体了。我想弄清楚如何将一些任意函数应用于列表的每个成员。使用apply()是不可能的,我认为sapply()只适用于列表。

4 个答案:

答案 0 :(得分:5)

你可以这样做:

v <- v * c(2, 3)[v %% 2 + 1]

任何v %% n都可以推广,例如:

v <- v * c(2, 3, 9, 1)[v %% 4 + 1]

此外,length(v)不需要n的倍数。

答案 1 :(得分:3)

您可以使用矢量乘法来执行您想要的操作:

tmp <- 1:10
tmp * rep(c(3,2), length(tmp)/2)

这很容易扩展到三种或更多种情况:

tmp * rep(c(3,2,4), length(tmp)/3)

答案 2 :(得分:2)

最简单的是:

v*c(2,3) # as suggested by flodel in a comment.

在文档中搜索的术语是“参数回收”...... R语言的一个特性。仅适用于二元中缀函数(请参阅?Ops)。对于非dyadcic矢量化函数,它们不会因某些参数而出错,并且你不能依赖于“v”的结构,那么你可以使用ifelse:

ifelse( (1:length(v)) %% 2 == 0, func1(v), func2(v) )

这构造了两个向量,然后根据第一个参数的真值选择第一个或第二个中的元素。如果您试图回答帖子标题中的问题,那么您应该查看:

?sapply

答案 3 :(得分:1)

这是一个答案,允许任何一组任意函数应用于向量中的已定义组。

# source data
test <- 1:9
# categorisations of source data
cattest <- rep(1:3,each=3)
#[1] 1 1 1 2 2 2 3 3 3

使函数以差分方式应用函数:

categ <- function(x,catg) {
          mapply(
                 function(a,b) {
                                switch(b,
                                       a * 2,
                                       a * 3,
                                       a / 2
                                      )
                               },
                  x,
                  catg
                 )
         }
# where cattest = 1, multiply by 2
# where cattest = 2, multiply by 3
# where cattest = 3, divide by 2

结果:

categ(test,cattest)
#[1]  2.0  4.0  6.0 12.0 15.0 18.0  3.5  4.0  4.5