我有一個向量列表,例如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]
您能顯示您使用的實際代碼嗎? – 2014-12-04 14:49:23
@beginneR我加了它 – yliueagle 2014-12-04 15:04:49
你的向量是否總是包含整數?如果是,聯合的範圍是什麼(這裏是1到7)?還請詳細說明您的列表有多大以及這些媒介有多長。 – flodel 2014-12-04 15:22:44