2015-07-30 2 views
0

У меня есть следующие наборы данных, которые я хочу сравнить для сходства в элементах, которые они содержат, используя стратегию циклирования, которая допускает все возможные комбинации (т. Е. «SetA, setB, setC, setD») ; "множество А, SETB, SETC", "множество А, SETB", "SETB, SETC, setD"; "SETC, setD"; "SETB, setD" наборы и т.д.цикл над наборами данных для аналогичных элементов

данных:

setA <- c("dog", "cat", "cow", "sheep", "dunkey") 

setB <- c("fox", "cat", "cow", "snake") 

setC <- c("dog", "cat", "cow", "sheep", "dunkey", "fox", "python") 

setD <- c("dog", "cat", "lion", "sheep", "elephant", "fox") 

Не конечно, как закодировать это в R, но вот моя попытка, которая не дала ожидаемых результатов:

similar <- function(...){ 
    Reduce(intersect, list(...)) 

} 


allSets <- list(setA, setB, setC, setD) 

for(i in 1:length(allSets)){ 
    similar(allSets[[i]]) 
    similar(allSets[i-1]) 
    similar(allSets[i-2]) 
    similar(allSets[i-3]) 
} 

Может ли кто-нибудь помочь PLS?

+0

Что такое желаемый результат? –

ответ

2

Вот функция от previous post, чтобы получить все перекрестки

## Build intersections, 'out' accumulates the result 
intersects <- function(sets, out=NULL) { 
    if (length(sets) < 2) return (out)        # return result 
    len <- seq(length(sets)) 
    if (missing(out)) out <- list()         # initialize accumulator 
    for (idx in split((inds <- combn(length(sets), 2)), col(inds))) { # 2-way combinations 
     ii <- len > idx[2] & !(len %in% idx)       # indices to keep for next intersect 
     out[[(n <- paste(names(sets[idx]), collapse="."))]] <- intersect(sets[[idx[1]]], sets[[idx[2]]]) 
     out <- intersects(append(out[n], sets[ii]), out=out) 
    } 
    out 
} 

## Put the sets in a list 
sets <- mget(paste0("set", toupper(letters[1:4]))) 

intersects(sets) 
# $setA.setB 
# [1] "cat" "cow" 
# 
# $setA.setB.setC 
# [1] "cat" "cow" 
# 
# $setA.setB.setC.setD 
# [1] "cat" 
# 
# $setA.setB.setD 
# [1] "cat" 
# 
# $setC.setD 
# [1] "dog" "cat" "sheep" "fox" 
# 
# $setA.setC 
# [1] "dog" "cat" "cow" "sheep" "dunkey" 
# 
# $setA.setC.setD 
# [1] "dog" "cat" "sheep" 
# 
# $setA.setD 
# [1] "dog" "cat" "sheep" 
# 
# $setB.setC 
# [1] "fox" "cat" "cow" 
# 
# $setB.setC.setD 
# [1] "fox" "cat" 
# 
# $setB.setD 
# [1] "fox" "cat" 
+0

Потрясающе! Только то, что я хотел. Спасибо nongkrong, код работал для меня. Очень признателен. –