从列表中提取累积唯一元素

3

我有一个列表:

z <- vector("list", 3)
z[[1]]=c(1,2,3,4)
z[[2]]=c(1,6,2,9)
z[[3]]=c(1,2,3,4,5)

我希望创建一个列矩阵,其中列表中有尽可能多的项目(3)。
A=matrix(0,3,1)

我希望每一行矩阵都包含Z列表中尚未看到的唯一元素的累积数量。例如,
矩阵应该填充如下:
     [1]
A=[1] 4
  [2] 6
  [3] 7

(因为每个元素都是新的,所以是4,然后因为其他元素已经在z [[1]]中出现过,所以是6,最后5是唯一的新元素,所以是7。)

有人知道一个好的方法吗?我可以用循环方式编程,制作一个虚拟矩阵,使用唯一性和if条件测试,但这似乎有点过度。

感谢您的时间。

3个回答

2

我认为您需要使用一些允许您进行迭代循环的东西,因此我在这里使用了一个for 循环。 我们获取所有唯一元素,并对z中的每个元素执行sum操作,该操作将在唯一元素中的值相加,然后为下一次迭代删除它们...

#  Get unique elements
elems <- unique( unlist( z ) )

#  Pre allocate result vector
tot <- numeric(length(z))

for( i in 1:length(z) ){
    # How many unique elements are in this list element
    tot[i] <-  sum( z[[i]] %in% elems )
    #  Remove them from the list so they are not counted in the next iteration
    elems <- elems[ ! elems %in% z[[i]] ]       
  }

#  Get the cumulative sum
cumsum( tot )
[1] 4 6 7

2
如果性能不是问题,你可以做以下操作。如果列表 / 向量非常长,我认为这会很费力。
test = matrix(data = 0,ncol = 1,nrow=length(z))

for (i in 1:length(z)){
  test[i,1]=length(unique(Reduce(c,z[1:i])))
}

test
     [,1]
[1,]    4
[2,]    6
[3,]    7

0
也许这是一个不必要复杂的做法,但你可以使用递归函数。
z <- vector("list", 3)
z[[1]]=c(1,2,3,4)
z[[2]]=c(1,6,2,9)
z[[3]]=c(1,2,3,4,5)

f<-function(x,left=c()) {
  new<-unique(x[[1]][!(x[[1]] %in% left)])
  new.left<-c(new,left)
  if (length(x)==1) return(length(new))
  else return(c(length(new),f(x[-1],left=new.left)))
}
as.matrix(cumsum(f(z)),ncol=1)

     [,1]
[1,]    4
[2,]    6
[3,]    7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接