使用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)
基本上,这有效,但不能很好地扩展。 任何帮助将非常感激!感谢
答案 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次的向量。根据您当前的数据设置和您想要的结果,这将是您的时间限制因素。