假设我想将向量的每个偶数元素乘以2,将向量的每个奇数元素乘以3.以下是一些可以执行此操作的代码:
v <- 0:10
idx <- v %% 2 == 0
v[idx] <- v[idx] * 2
v[!idx] <- v[!idx] * 3
如果我有两个以上的案例,这将变得困难。看起来应用函数系列从不处理向量,所以我不知道更好的方法来解决这个问题。如果我对数据进行了转换,也许使用apply函数会有效,但似乎不应该是我需要做的事情来解决这个简单的问题。
有什么想法吗?
编辑:抱歉让您感到困惑。我对“%%”运算符并不特别感兴趣。我想在我的问题中提出一些具体的代码,但是,根据对问题的回答,这个代码太具体了。我想弄清楚如何将一些任意函数应用于列表的每个成员。使用apply()是不可能的,我认为sapply()只适用于列表。
答案 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