我想要计算往年不存在的新元素。在示例中
示例数据:
var1 <- list('2003' = 1:3, '2004' = c(4:3), '2005' = c(6,4,1), '2006' = 1:4 )
我想获得输出
newcount <- list('2003' = 0, '2004' = 1, '2005' = 1, '2006' = 0)
代码不成功:
newcount <- mapply(setdiff, var1, seq_along(var1), function(i)
{if (i > 1) {Reduce(union, var1[i-1], accumulate=T)}}, length)
答案 0 :(得分:5)
几乎就在那里,但最好使用向量索引来处理偏移并随后添加始终已知的初始元素:
lapply(c(list(`2003`=integer(0)),
mapply(setdiff,var1[-1],
Reduce(union,var1,accumulate=TRUE)[-length(var1)])),length)
$`2003`
[1] 0
$`2004`
[1] 1
$`2005`
[1] 1
$`2006`
[1] 0
答案 1 :(得分:4)
假设var1
按年份排序,而2003年您希望3
而不是1
,则可以尝试
newcount <- lapply(seq_along(var1),function(x){
prev<-unlist(var1[seq_len(x-1)])
# Improvement suggested by plannapus
sum(!var1[[x]]%in%prev) # length(which(!var1[[x]]%in%prev))
})
names(newcount)<-names(var1)
newcount
# $`2003`
# [1] 3
# $`2004`
# [1] 1
# $`2005`
# [1] 1
# $`2006`
# [1] 0
好的,如果您完全确定2003应该为0(我认为这是您的逻辑的例外),那么您可以执行以下操作:
newcount <- c(0, lapply(seq_along(var1)[-1],function(x){
prev<-unlist(var1[seq_len(x-1)])
sum(!var1[[x]]%in%prev)
}))