3

5 つのベクトルがあるとします。

a <- c(1,2,3)
b <- c(2,3,4)
c <- c(1,2,5,8)
d <- c(2,3,4,6)
e <- c(2,7,8,9)

Reduce()次のようにと一緒に使用することで、それらすべての交点を計算できることを知っていますintersect()

Reduce(intersect, list(a, b, c, d, e))
[1] 2

しかし、たとえば少なくとも 2 つのベクトルに共通する要素を見つけるにはどうすればよいでしょうか? すなわち:

[1] 1 2 3 4 8
4

7 に答える 7

8

多くの人が見ているよりもはるかに簡単です。これは非常に効率的です。

  1. すべてをベクトルに入れる:

    x <- unlist(list(a, b, c, d, e))
    
  2. 重複を探す

    unique(x[duplicated(x)])
    # [1] 2 3 1 4 8
    

必要にsort応じて。

注:リスト要素内に重複がある可能性がある場合(あなたの例は関係していないようです)、次のように置き換えxますx <- unlist(lapply(list(a, b, c, d, e), unique))


編集: OP は、n >= 2 のより一般的なソリューションに関心を示しているため、次のようにします。

which(tabulate(x) >= n)

例のように、データが自然整数 (1、2 など) のみで構成されている場合。そうでない場合:

f <- table(x)
names(f)[f >= n]

これは、James のソリューションとはかけ離れたものではありませんが、コストのかかるsort. また、すべての可能な組み合わせを計算するよりもはるかに高速です。

于 2014-10-03T10:35:34.573 に答える
2

たとえば、次のようなすべての可能な組み合わせを試すことができます。

## create a list
l <- list(a, b, c, d)

## get combinations
cbn <- combn(1:length(l), 2)

## Intersect them 
unique(unlist(apply(cbn, 2, function(x) intersect(l[[x[1]]], l[[x[2]]]))))
## 2 3 1 4
于 2014-10-03T08:27:58.660 に答える
2

別のオプションは次のとおりです。

# For each vector, get a vector of values without duplicates
deduplicated_vectors <- lapply(list(a,b,c,d,e), unique)

# Flatten the lists, then sort and use rle to determine how many
# lists each value appears in
rl <- rle(sort(unlist(deduplicated_vectors)))

# Get the values that appear in two or more lists
rl$values[rl$lengths >= 2]
于 2014-10-03T08:35:49.980 に答える
0

これは、各一意の値が発生するベクトルの数をカウントするアプローチです。

unique_vals <- unique(c(a, b, c, d, e))

setNames(rowSums(!!(sapply(list(a, b, c, d, e), match, x = unique_vals)),
                 na.rm = TRUE), unique_vals)
# 1 2 3 4 5 8 6 7 9 
# 2 5 3 2 1 2 1 1 1 
于 2014-10-03T08:26:39.000 に答える
0

@rengis メソッドのバリエーションは次のようになります。

unique(unlist(Map(`intersect`, cbn[1,], cbn[2,])))
#[1] 2 3 1 4 8

どこ、

l <- mget(letters[1:5])
cbn <- combn(l,2)
于 2014-10-03T09:54:34.740 に答える
0

でベクトル化された関数を適用するさらに別のアプローチouter:

L <- list(a, b, c, d, e)
f <- function(x, y) intersect(x, y)
fv <- Vectorize(f, list("x","y"))
o <- outer(L, L, fv)
table(unlist(o[upper.tri(o)]))

#  1  2  3  4  8 
#  1 10  3  1  1 

上記の出力は、複製された各要素 1、2、3、4、および 8 を共有するベクトルのペアの数を示します。

于 2014-10-03T09:07:46.563 に答える
0

ベクトルが巨大な場合、ソリューションはduplicatedシステムtabulateをオーバーフローする可能性があります。その場合、dplyr は次のコードで役に立ちます。

library(dplyr) combination_of_vectors <- c(a, b, c, d, e)
#For more than 1 
combination_of_vectors %>% as_tibble() %>% group_by(x) %>% filter(n()>1)
#For more than 2 
combination_of_vectors %>% as_tibble() %>% group_by(x) %>% filter(n()>2)
#For more than 3 
combination_of_vectors %>% as_tibble() %>% group_by(x) %>% filter(n()>2)

それが誰かに役立つことを願っています

于 2021-06-15T13:32:26.700 に答える