我有两个长度相等的向量,我想根据第二个条件将第一个值减半。举一个具体的例子,让
V1 = 1:6 ; V2 = c(0,0,1,1,0,1)
我想将V1中的每个值除以2,这相当于V2中的1。
我知道如何使用for循环执行此操作,但每个向量都有几十万个元素,所以看起来应该有一个更快的方法。
我真正想要的是应用功能,但仅适用于选择性元素。
答案 0 :(得分:5)
v1 = c(1:6)
v2 = c(0,0,1,1,0,1)
v1 / (v2+1)
更一般地说,如果您需要应用函数,请查看?mapply
mapply(function(x1, x2) { if (x2==1) { x1/2; } else { x1 } } , v1, v2)
这是一种使用data.table的方法,这可能很快......
library(data.table)
DT[v2==1,divisor:=2]
DT[v2==0,divisor:=1]
DT[,answer:=v1/divisor]
答案 1 :(得分:4)
v1 <- c(1:6)
v2 <- c(0,0,1,1,0,1)
v1 / (v2 + 1)
#[1] 1.0 2.0 1.5 2.0 5.0 3.0
要使用策略将函数应用于所选元素,您需要将v2
转换为逻辑向量并将其用于子集化:
as.logical(v2)
#[1] FALSE FALSE TRUE TRUE FALSE TRUE
res <- v1
res[as.logical(v2)] <- res[as.logical(v2)] / 2
res
#[1] 1.0 2.0 1.5 2.0 5.0 3.0
res[as.logical(v2)]
#[1] 1.5 2.0 3.0