R 从列表中提取累积的唯一元素
我有一份清单:R 从列表中提取累积的唯一元素,r,matrix,unique,extract,R,Matrix,Unique,Extract,我有一份清单: 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) 我希望矩阵的每一行都包含Z列表中以前从未见过的唯一元素的累积数量。那么比如说, 矩阵应填充为: [1] A=[1] 4 [2] 6 [3] 7 (4是因为每个元素都是新的,6是因为其他元素以前在z[[1]]中见过,7是因为5是唯一的新元素。) 有人知道这样做的好方法吗?我可以用一种非常愚蠢的方式编
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)
我希望矩阵的每一行都包含Z列表中以前从未见过的唯一元素的累积数量。那么比如说,
矩阵应填充为:
[1]
A=[1] 4
[2] 6
[3] 7
(4是因为每个元素都是新的,6是因为其他元素以前在z[[1]]中见过,7是因为5是唯一的新元素。)
有人知道这样做的好方法吗?我可以用一种非常愚蠢的方式编程,在3上循环,生成一个虚拟矩阵,用if条件进行惟一性测试,但这似乎有点过分
谢谢你抽出时间 我认为您需要使用一些允许迭代循环的东西,因此我在这里使用
for
循环。我们得到所有唯一元素,对于z
中的每个元素,我们求和
唯一元素中的值,然后在下一次迭代中删除它们
# 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
#获取唯一元素
elems可能是一种不必要的复杂处理方式,但可以使用递归函数
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
z如果性能不是真正的问题,您可以执行以下操作。如果列表/向量很长,我可以看到它很累人
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
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