2017-06-13 62 views
3

我有索引的矢量,它包含重复的值:矢量化环具有重复指数

IN <- c(1, 1, 2, 2, 3, 4, 5)  

我想使用这些索引中减去两个向量:

ST <- c(0, 0, 0, 0, 0, 0, 0) 
SB <- c(1, 1, 1, 1, 1, 1, 1) 

然而,我想以“顺序”进行减法,使得在减去第一指标值(0,1)之后,第二减法将“构建”第一减法。我想用一个向量FN看起来像这样结束了:

c(-2, -2, -1, -1, -1, 0, 0) 

这是很容易的做到了循环:

for(i in seq_along(IN)){ 
    ST[IN[i]] <- ST[IN[i]] - SB[IN[i]] 
} 

但我需要运行这个循环多次长载体,这可能需要很多小时。有什么方法可以矢量化这个任务并避免for循环?也许使用data.table技术?

+1

谢谢你的回应。我将不得不做一些测试,看看哪种方法对我的需求最快,但都能完成工作。 – ken

回答

4

当然,与data.table,它与基础R

library(data.table) 
DT = data.table(ST) 
mDT = data.table(IN, SB)[, .(sub = sum(SB)), by=.(w = IN)] 
DT[mDT$w, ST := ST - mDT$sub ] 

    ST 
1: -2 
2: -2 
3: -1 
4: -1 
5: -1 
6: 0 
7: 0 

或者:

w = sort(unique(IN)) 
ST[w] <- ST[w] - tapply(SB, IN, FUN = sum) 
# [1] -2 -2 -1 -1 -1 0 0 
2

这里是基础R使用aggregate一个选项:

ag <- aggregate(.~IN, data.frame(IN, ST[IN]-SB[IN]), sum) 
replace(ST, ag[,1], ag[,2]) 

#[1] -2 -2 -1 -1 -1 0 0 

,或者使用xtabs

d <- as.data.frame(xtabs(B~A, data.frame(A=IN, B=ST[IN]-SB[IN]))) 
replace(ST, d[,1], d[,2])