在R中的列表中交叉向量的聯合
我有一個向量列表如下.
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]])
如何首先識別交叉向量?有沒有辦法將列表分成交叉向量組的列表?
更新
這是嘗試使用data.table.獲得所需的結果.但是對於這個ofollow,noindex" target="_blank">example 資料集中的大型列表來說仍然很慢.
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) , "," )
這樣就像一個圖形問題,所以我喜歡用這個圖書庫,使用你的樣本資料,你可以做
library(igraph) #build edgelist el <- do.call("rbind",lapply(data, embed, 2)) #make a graph gg <- graph.edgelist(el, directed=F) #partition the graph into disjoint sets split(V(gg)$name, clusters(gg)$membership) # $`1` # [1] "b" "a" "c" "d" "n" # # $`2` # [1] "h" "g" "k" "i"
我們可以檢視結果
V(gg)$color=c("green","purple")[clusters(gg)$membership] plot(gg)
http://stackoverflow.com/questions/27520310/union-of-intersecting-vectors-in-a-list-in-r