9

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

v <- 0:10

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

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

有任何想法吗?

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

4

4 回答 4

6

你可以做:

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

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

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

它也不需要length(v)是 的倍数n

于 2013-01-08T01:11:31.363 回答
4

你可以使用向量乘法来做你想做的事:

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

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

tmp * rep(c(3,2,4), length(tmp)/3)
于 2013-01-08T00:33:51.990 回答
3

最简单的是:

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

在文档中搜索的术语是“参数回收”...... R 语言的一个特性。仅适用于二进中缀函数(请参阅 参考资料?Ops)。对于不会与某些参数出错并且您不能依赖“v”的结构非常规则的非二元向量化函数,您可以使用 ifelse:

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

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

?sapply
于 2013-01-08T01:21:37.650 回答
2

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

# 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
于 2013-01-08T02:02:15.993 回答