จะหาองค์ประกอบทั่วไปจากเวกเตอร์หลายตัวได้อย่างไร


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เป็นชื่อตัวแปร ...
มาเร็ค

4
ทำไมมันเป็นจดหมายเหมือนคนอื่น ๆ ?
Mostafa

12
@DimitriPetrenko c(1,2...)เพราะคุณสามารถประกาศรายการที่มี
Mathias711

คำตอบ:


333

อาจมีวิธีที่ฉลาดกว่าในการทำสิ่งนี้ แต่

intersect(intersect(a,b),c)

จะทำงาน

แก้ไข: ชาญฉลาดมากขึ้นและสะดวกยิ่งขึ้นถ้าคุณมีข้อโต้แย้งมากมาย:

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

16
+1 เพื่อเตือนเราเกี่ยวกับReduceการใช้อักษรตัวพิมพ์ใหญ่ R ที่ถูกต้อง!
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ฟังก์ชันพร้อมกับลบ subscripting เพื่อลบออกซ้ำ ๆ ทุกองค์ประกอบที่เพิ่มเข้าไปใน "เคอร์เนล"
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, หรือbc


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.