子序列考慮以下數據集:確定共同*非連續*代表出現
set.seed(50)
d = matrix(rbinom(1000, 1, 0.9), ncol = 20)
每行對應於一個對象,並且每一列對應於一個 測量的物體的。例如,行可以是個人在 研究和列可以重複測量時間。在這個 的情況下,測量結果爲TRUE/FALSE,表示存在或不存在 對象。
我在尋找一種算法,讓我能夠發現n
一致意見行 最大的集合。 換句話說,我正在尋找一種方法來篩選所有 具有相同列中的TRUE值的行。該組的成員 可能具有超過n
的TRUE值。
的簡單的例子:用20(全部)TRUE值的行被
which(apply(d, 1, all))
標識行3, 10, 12, 24, 36, 39, 48, 50
捕獲。同樣,它的 容易識別所有獨特的序列和標識共享 相同的觀察組:
unique.series = d[which(!duplicated(d)),]
groups = vector("list", nrow(unique.series))
for(i in seq_along(groups))
groups[[i]] = which(apply(d, 1, function(x)
identical(x, unique.series[i,])))
但是如果我想用19個或更多的觀察各組?例如, 基3
(行3, 10, 12, 24, 36, 39, 48, 50
)和21
(行23, 32, 40
)僅通過觀察不同9
(組3具有的觀察,但組21
沒有)。我如何 以編程方式識別部分匹配的系列,即包含匹配觀測的一些子集?這看起來像一個匹配 問題的子序列,但它更抽象一點,因爲子序列不需要連續。
一種方式是使用正則表達式,但我不能得到它的工作 權:
unique.strings = lapply(
apply(unique.series, 1, function(x)
which(as.logical(x))),
paste,
collapse = ","
)
reg.strings = paste0("^", lapply(
apply(unique.series, 1, function(x)
sprintf("(%d)", which(as.logical(x)))),
paste, collapse = "+(,[0-9],)*"), "$")
lapply(unique.strings, grep, x = unique.strings) # NOT CORRECT
我將不勝感激任何替代算法或其他基於正則表達式,。