У меня есть список векторов следующим образом.
data <- list(v1=c("a", "b", "c"), v2=c("g", "h", "k"),
v3=c("c", "d"), v4=c("n", "a"), v5=c("h", "i"))
Я пытаюсь достичь следующих
1) Проверьте, пересекаются ли какие-либо из векторов друг с другом.
2) Если найдены пересекающиеся векторы, получим их объединение.
Таким образом, желаемый результат
out <- list(v1=c("a", "b", "c", "d", "n"), v2=c("g", "h", "k", "i"))
Я могу получить объединение группы пересекающихся множеств следующим образом.
Reduce(union, list(data[[1]], data[[3]], data[[4]]))
Reduce(union, list(data[[2]], data[[5]])
Как первыми идентифицировать пересекающиеся векторы? Есть ли способ деления списка на списки групп пересекающихся векторов?
Update
Вот попытка использования data.table. Получает желаемые результаты. Но все же медленный для больших списков, как в этом пример набора данных.
datasets.
data <- sapply(data, function(x) paste(x, collapse=", "))
data <- as.data.frame(data, stringsAsFactors = F)
repeat {
M <- nrow(data)
data <- data.table( data , key = "data" )
data <- data[ , list(dataelement = unique(unlist(strsplit(data , ", " )))), by = list(data)]
data <- data.table(data , key = "dataelement" )
data <- data[, list(data = paste0(sort(unique(unlist(strsplit(data, split=", ")))), collapse=", ")), by = "dataelement"]
data$dataelement <- NULL
data <- unique(data)
N <- nrow(data)
if (M == N)
break
}
data <- strsplit(as.character(data$data) , "," )