여러 벡터에서 공통 요소를 찾는 방법은 무엇입니까?


159

누구든지 여러 벡터에서 공통 요소를 찾는 방법을 말해 줄 수 있습니까?

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

위의 벡터에서 공통 요소를 가져오고 싶습니다 (예 : 3 및 9)


45
c변수 이름 으로 사용하는 것은 좋지 않습니다 ...
Marek

4
왜 다른 사람들과 같은 편지입니까?
Mostafa

12
@DimitriPetrenko로 목록을 선언 할 수 있기 때문입니다 c(1,2...).
Mathias711

답변:


333

이것에 대해 더 영리한 방법이있을 수 있지만

intersect(intersect(a,b),c)

일을 할 것입니다.

편집 : 많은 주장이있는 경우보다 영리하고 편리합니다.

Reduce(intersect, list(a,b,c))

16
우리에게 Reduce올바른 R 대문자 를 상기시켜주는 +1 !
mariotomo

8
그것은 intersect세트 작업을위한 것입니다. 벡터에 반복되는 요소가 있으면 벡터가 교차하기 전에 세트로 바뀌기 때문에이 정보가 손실됩니다. 예를 들어 intersect(c(1,1,2,3), c(1,1,3,4))결과 c(1,3)가 나왔을 수 있습니다 c(1,1,3).
Giora Simchoni

1
@GioraSimchoni 정말 원하는 것이면 어떻게 c (1,1,3)을 얻을 수 있습니까?
StatsSorceress

@StatsSorceress 목록 L에있는 양의 정수로 구성된 벡터의 "교차점 보존 중복"을 원한다고 가정 해 봅시다. 다음 코드가 작동합니다. N <- max(unlist(L)); LT <- lapply(L, tabulate, nbins = N); v <- do.call(pmin, LT); unlist(sapply(1:N, function(x) rep(x, v[x])))이 작업을 수행하는 또 다른 방법 match은 음수 첨자와 함께 함수를 사용하여 각 벡터에서 반복적으로 제거하는 것입니다. 모든 요소가 "커널"에 추가되었습니다.
Montgomery Clift

24

좋은 대답은 이미 있지만이 작업을 수행하는 몇 가지 다른 방법이 있습니다.

unique(c[c%in%a[a%in%b]])

또는,

tst <- c(unique(a),unique(b),unique(c))
tst <- tst[duplicated(tst)]
tst[duplicated(tst)]

당신은 분명히 생략 할 수 unique는없는 반복 값이 안에 있다는 것을 알고있는 경우 통화를 a, b또는 c.


7
intersect_all <- function(a,b,...){
  all_data <- c(a,b,...)
  require(plyr)
  count_data<- length(list(a,b,...))
  freq_dist <- count(all_data)
  intersect_data <- freq_dist[which(freq_dist$freq==count_data),"x"]
  intersect_data
}


intersect_all(a,b,c)

업데이트 편집 더 간단한 코드

intersect_all <- function(a,b,...){
  Reduce(intersect, list(a,b,...))
}

intersect_all(a,b,c)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.