R 计算向量列表中的新元素

R 计算向量列表中的新元素,r,lapply,R,Lapply,我想数一数前几年没有的新元素。在这个例子中 样本数据: var1 <- list('2003' = 1:3, '2004' = c(4:3), '2005' = c(6,4,1), '2006' = 1:4 ) newcount <- mapply(setdiff, var1, seq_along(var1), function(i) {if (i > 1) {Reduce(union, var1[i-1], accumulate=T)}}, len

我想数一数前几年没有的新元素。在这个例子中

样本数据:

var1 <- list('2003' = 1:3, '2004' = c(4:3), '2005' = c(6,4,1), '2006' = 1:4 )
newcount <- mapply(setdiff, var1, seq_along(var1), function(i) 
            {if (i > 1) {Reduce(union, var1[i-1], accumulate=T)}}, length)

var1差不多了,但最好使用向量索引处理偏移量,然后添加始终已知的初始元素:

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

假设
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

newcount请学习术语。您有一个向量列表,而不是数据帧。
diff(sappy(Reduce(union,var1,acculate=TRUE),length))
#[1]10@DWin,这将是我选择的解决方案,如果您将其作为回答而不是评论。非常整洁,非常可读!詹姆斯的解决方案就是我想到的。我只是稍微修剪了一下他的头发。将其添加为答案似乎不正确。使用该选项可以在一行中获得最大数量的函数调用吗?;-)(说真的,这太过分了。)好吧,80个角色都太过份了;)@plannapus,好建议。上面更改了。另外,2003年没有以前的年份,所以如果我们计算以前年份发现的东西的数量,它应该是0?@GavinSimpson,谢谢你的评论。我认为OP想要在第一年的元素数量,而这些元素在前一年都不存在。因此,尽管我可以理解2003年的0,但这似乎是一个例外。这将是一个简单的更改,但却是一个“硬代码”。是的,只需重新编写
2:length(var1)
和硬代码0。OP的预期产出非常明确
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
newcount <- c(0, lapply(seq_along(var1)[-1],function(x){
  prev<-unlist(var1[seq_len(x-1)])
  sum(!var1[[x]]%in%prev)
}))