8

過去に存在しなかった新しい要素を数えたいと思います。例では

サンプルデータ:

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)
4

2 に答える 2

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
于 2012-09-04T08:11:01.033 に答える
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

OK、2003が0であるべきだと絶対に確信している場合(これはあなたのロジックの例外と見なされます)、次のようにすることができます。

newcount <- c(0, lapply(seq_along(var1)[-1],function(x){
  prev<-unlist(var1[seq_len(x-1)])
  sum(!var1[[x]]%in%prev)
}))
于 2012-09-04T08:11:32.863 に答える