快速划分特定值R.

时间:2015-04-21 07:24:30

标签: r

我有两个长度相等的向量,我想根据第二个条件将第一个值减半。举一个具体的例子,让

V1 = 1:6 ; V2 = c(0,0,1,1,0,1)

我想将V1中的每个值除以2,这相当于V2中的1。

我知道如何使用for循环执行此操作,但每个向量都有几十万个元素,所以看起来应该有一个更快的方法。

我真正想要的是应用功能,但仅适用于选择性元素。

2 个答案:

答案 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