我有一个向量列表,例如
我希望有一个非常快的实现,因为
vecs = list(vec1=1:3, vec2=1:5, vec3=2:6, vec4=1:7)
。我想删除所有在其他列表成员中包含的列表成员。例如,vecs$vec1
是 vecs$vec2
(或者vecs$vec4
)的一部分,因此我要将其删除。我希望有一个非常快的实现,因为
length(vecs)
非常大。我所做的是首先按长度对 vecs
成员进行排序 vecs = vecs[ order(unlist(lapply(vecs, length))) ]
,然后对于check_member = vecs[i]
,检查它是否是vecs[ i+1 ], vecs[ i+2 ]...
的一部分。是否有更好的策略?完整代码:vecs = list(vec1=1:3, vec2=1:5, vec3=2:6, vec4=1:7, vec5=2:3)
vecs = vecs[ order(unlist(lapply(vecs, length))) ] ##sort by member length
vecs_len = length(vecs)
toRemove = numeric(vecs_len ) ##record whether to remove this member
for( i in 1:(vecs_len-1 ))
for( j in (i+1):(vecs_len ))
{
if( length( setdiff(vecs[[i]],vecs[[j]]) )==0 ) {toRemove[i] = 1; break} ##check whether vecs[[i]] is part of vecs[[j]]
}
vecs = vecs[!toRemove]