删除此列表的最快方法是循环?

时间:2014-01-23 00:10:13

标签: r performance list for-loop

使用R:

我有一个长度为n的向量列表,它对应于id的向量,长度为n。所以列表中的每个向量都有m个id。我还有一个值向量,长度m:

L1 = c(1,65,23)
L2 = c(1,23,45)
L3 = c(45,23)
L4 = c(45,65)

V2 = list(L1,L2,L3,L4)

IDs = c(1, 23, 45, 65)
Values = c(400, 500, 100, 150)
dat = data.frame(IDs, Values)

我想从相应的(按索引)列表中减去每个值。 在一个循环中,这将是:

testFun = function(dat){
        y = list()
        for (i in 1:nrow(dat)){
        y[[i]] = dat$Value[i] - dat$Value[which(dat$IDs %in% V2[[i]])]

        }
    return(y)
    }
testFun(dat)

基本上,这有效,但不能很好地扩展。 任何帮助将非常感激!感谢

2 个答案:

答案 0 :(得分:0)

另一种方法是以表格形式保存结果。这是一个data.table解决方案

# convert your data to data.table
library(data.table)
DT <- data.table(dat, key="IDs")

DT[, Values - DT[.(V2[[i]])]$Values , by=list(i=seq(nrow(DT)))]
    i   V1
 1: 1    0
 2: 1  250
 3: 1 -100
 4: 2  100
 5: 2    0
 6: 2  400
 7: 3    0
 8: 3 -400
 9: 4   50
10: 4    0

答案 1 :(得分:0)

这是另一个data.table解决方案

DT <- data.table(dat, key = 'IDs')

DT[, col3 := vector(mode='list',length = nrow(DT))]

for (i in seq_along(V2)){
   set(DT, i = i, j = 'col3', value = list(list(DT[i,Values] - DT[.(V2[[i]])][['Values']])))
}

请注意,您要创建一个长度为175000,175000次的向量。根据您当前的数据设置和您想要的结果,这将是您的时间限制因素。