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

dub*_*ois 6 r vector apply

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

v <- 0:10

idx <- v %% 2 == 0
v[idx] <- v[idx] * 2
v[!idx] <- v[!idx] * 3
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

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

flo*_*del 5

你可以做:

v <- v * c(2, 3)[v %% 2 + 1]
Run Code Online (Sandbox Code Playgroud)

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

v <- v * c(2, 3, 9, 1)[v %% 4 + 1]
Run Code Online (Sandbox Code Playgroud)

此外,它也不必length(v)是的倍数n


42-*_*42- 3

最简单的是:

v*c(2,3) # as suggested by flodel in a comment.
Run Code Online (Sandbox Code Playgroud)

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

ifelse( (1:length(v)) %% 2 == 0, func1(v), func2(v) )
Run Code Online (Sandbox Code Playgroud)

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

?sapply
Run Code Online (Sandbox Code Playgroud)