向量化操作的工作方式是将逻辑应用于向量的每个元素。
但是,假设我有一个向量,即。
> 1:10
[1] 1 2 3 4 5 6 7 8 9 10
字符串
我想应用一个函数,比如说,对除了第一个和最后一个元素之外的每个元素乘以0.5:我想把它们乘以0.3。
有没有一个dspur(或任何其他矢量化)的方法来做到这一点?
我知道sapply与if-else结构可以做到这一点,即。
sapply(seq(1:10), #I know seq() is not actually needed in this particular case
function(i) {
if(i == 1 | i == length(1:10)) {
(1:10)[i]*0.3
} else {
(1:10)[i]*0.5
}
}
)
型
.但是使用索引依赖的case_when的向量化解决方案会很好。
4条答案
按热度按时间fhity93d1#
由于您在标题中明确提到了
case_when
,因此一个索引相关的case_when
解决方案可能是:字符串
输出量:
型
rpppsulh2#
ifelse
是矢量化的,因此您可以使用字符串
这是另一个具有相同逻辑但没有
ifelse
的。型
其中
seq_along(x) %in% c(1, length(x)) + 1
创建一个索引(1或2),并用于子集向量c(0.5, 0.3)
乘以x
。然而,在我看来,使用ifelse
不那么令人困惑。jv2fixgn3#
因此,正如我所看到的,你想用乘以0.3的值替换第一个和最后一个元素,否则乘以0.5。
你可以通过以下方式做到这一点:
字符串
作为一个功能:
型
使用此函数,您可以将0.3和0.5作为因子更改为不同的值。
速度方面,这可能是比使用
ifelse
或mutate
或任何apply
函数更快的解决方案。v9tzhpje4#
还有一个选择:
字符串