次のようなベクトルのリストがあります。
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) , "," )