R: สุ่มตัวอย่างที่ไม่ทับซ้อนกัน 2 ตัวอย่าง (สำหรับดัชนีเดียวกัน) ที่มีความยาว n จากเวกเตอร์ที่มีความยาว n เช่นกัน

สมมติว่าฉันมีเวกเตอร์ชื่อ all_combinations โดยมีตัวเลขตั้งแต่ 1 ถึง 20

ฉันต้องแยกเวกเตอร์ 2 ตัว (coding_1 และ coding_2) ที่มีความยาวเท่ากับ number_of_peptide_clusters ซึ่งก็คือ 20 เช่นกันในกรณีปัจจุบันของฉัน

เวกเตอร์ใหม่ 2 ตัวควรสุ่มตัวอย่างจาก all_combinations เพื่อไม่ให้ทับซ้อนกันในแต่ละตำแหน่งดัชนี

ฉันทำสิ่งต่อไปนี้:

set.seed(3)
all_combinations=1:20
number_of_peptide_clusters=20
coding_1 <- sample(all_combinations, number_of_peptide_clusters, replace = FALSE)
coding_1
 [1]  5 12  7  4 10  8 11 15 17 16 18 13  9 20  2 14 19  1  3  6
coding_2 <- sample(all_combinations, number_of_peptide_clusters, replace = FALSE)
coding_2
 [1]  5  9 19 16 18 12  8  6 15  3 13 14  7  2 11 20 10  4 17  1

นี่คือตัวอย่างที่ทำให้ฉันมีปัญหา เนื่องจากมีตัวเลขเพียงตัวเดียวซ้อนทับกันที่ดัชนีเดียวกัน (5 ที่ตำแหน่ง 1)

สิ่งที่ฉันจะทำในกรณีเหล่านี้คือหาตัวเลขที่ทับซ้อนกันแล้วสุ่มตัวอย่างใหม่จากรายการตัวเลขที่ทับซ้อนกันทั้งหมด...

ลองนึกภาพ coding_1 และ coding_2 คือ:

coding_1
 [1]  5 9  7  4 10  8 11 15 17 16 18 13  12 20 2  14 19  1  3  6
coding_2
 [1]  5 9 19 16 18 12  8  6 15  3 13 14  7  2  11 20 10  4 17  1

ในกรณีนี้ ฉันจะให้ 5 และ 9 ทับซ้อนกันในตำแหน่งเดียวกัน ดังนั้นฉันจะสุ่มตัวอย่างใหม่ใน coding_2 จากรายการทั้งหมดที่ทับซ้อนกัน [เปลี่ยนดัชนีตัวอย่าง 1 จาก c(5,9) เพื่อให้ไม่เท่ากับ 5 และจัดทำดัชนี 2 ดังนั้น ไม่เท่ากับ 9] ดังนั้น coding_2 จะเป็น:

coding_2
 [1]  9 5 19 16 18 12  8  6 15  3 13 14  7  2  11 20 10  4 17  1

อย่างไรก็ตาม ในกรณีเฉพาะข้างต้น ฉันไม่สามารถใช้วิธีการดังกล่าวได้... แล้วอะไรจะเป็นวิธีที่ดีที่สุดในการรับตัวอย่าง 2 ตัวอย่างที่มีความยาว 20 จากเวกเตอร์ที่มีความยาว 20 เช่นกัน เพื่อให้ตัวอย่างไม่ทับซ้อนกันในเวลาเดียวกัน ตำแหน่งดัชนี?

คงจะดีไม่น้อยหากฉันได้ตัวอย่างที่สอง coding_2 โดยที่รู้อยู่แล้ว coding_1... ไม่เช่นนั้นการได้รับ 2 ตัวอย่างพร้อมกันก็เป็นที่ยอมรับได้ ถ้ามันทำให้ทุกอย่างง่ายขึ้น ขอบคุณ!


person DaniCee    schedule 04.11.2020    source แหล่งที่มา
comment
โปรดพิจารณาว่าความยาวไม่ได้เท่ากับ 20 เสมอไป และแม้ว่า coding_1 และ coding_2 จะมีความยาวเท่ากันเสมอ แต่ all_combinations ก็สามารถมีค่าเท่ากันหรือใหญ่กว่าก็ได้   -  person DaniCee    schedule 04.11.2020


คำตอบ (1)


ฉันคิดว่าทางออกที่ดีที่สุดคือใช้กลยุทธ์การปฏิเสธ:

set.seed(3)
all_combinations <- 1:20
number_of_peptide_clusters <- 20
count <- 0
repeat {
  count <- count + 1
  message("Try number ", count)
  coding_1 <- sample(all_combinations, number_of_peptide_clusters, replace = FALSE)
  coding_2 <- sample(all_combinations, number_of_peptide_clusters, replace = FALSE)
  if (!any(coding_1 == coding_2))
    break
}
#> Try number 1
#> Try number 2
#> Try number 3
#> Try number 4
#> Try number 5
#> Try number 6
#> Try number 7
#> Try number 8
#> Try number 9
coding_1
#>  [1] 18 16 17 12 13  8  6 15  3  5 20  9 11  4 19  2 14  7  1 10
coding_2
#>  [1]  5 20 14  2 11  6  7 10 19  8  4  1 15  9 13 17 18 16 12  3

สร้างเมื่อ 04-11-2020 โดยแพ็คเกจ reprex (v0.3.0)

person user2554330    schedule 04.11.2020