我有一个向量列表如下。
data <- list(v1=c("a", "b", "c"), v2=c("g", "h", "k"),
v3=c("c", "d"), v4=c("n", "a"), v5=c("h", "i"))
我正在努力实现以下目标:
- 检查是否有任何向量相互交叉
- 如果找到相交向量,则获取它们的并集
所以想要的输出是
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 的尝试。得到想要的结果。但是对于本示例数据集中的大型列表仍然很慢。
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) , "," )