ทดสอบว่าเวกเตอร์มีองค์ประกอบที่กำหนดหรือไม่


518

วิธีการตรวจสอบว่าเวกเตอร์มีค่าที่กำหนด?


38
บางครั้งฉันถามตัวเองว่าทำไม R ไม่ใช้คำที่มีอยู่เพื่อให้ผู้ใช้ง่ายขึ้น
greg121

12
พิจารณาว่า "ใน" มีอยู่ใน "conta (ใน) s"; ฉันขอยืนยันว่า "ใน" เป็นคู่แข่งที่รัดกุมมากในบริบทนี้
hedgedandlevered

1
บางทีด้วยการเพิ่มของขนาบ%- ลงชื่อนั่นคือ คำinนี้เป็นคำสงวนในการใช้ R ในการสร้างวง
IRTFM

@ greg121 dplyr มีฟังก์ชั่นการบรรจุอยู่แล้วแต่มันถูกใช้เพื่อจุดประสงค์ที่แตกต่าง: เพื่อเลือกคอลัมน์ในกรอบข้อมูล select(iris, contains("etal"))เช่น
Paul Rougieux

มีวิธีรัดกุมที่จะทำเพื่อตัวเลขมูลค่าจริงด้วยความแม่นยำที่กำหนด?
mlt

คำตอบ:


500

ทั้งฟังก์ชั่นmatch()(คืนแรก) และ%in%(คืนค่าบูลีน) ได้รับการออกแบบมาสำหรับสิ่งนี้

v <- c('a','b','c','e')

'b' %in% v
## returns TRUE

match('b',v)
## returns the first location of 'b', in this case: 2

แล้วเรื่องการปรากฏตัวทั้งหมดไม่ใช่แค่เรื่องแรก?
StatsSorceress

บางทีฉันมาสายนิดหน่อย which(v, 'b'). ระวังลำดับของการขัดแย้ง
Niklas Mertsch

which(v, 'b')ข้อความแสดงข้อผิดพลาดของคุณให้ฉัน:> ข้อผิดพลาดที่ (v, 'b'): โต้แย้งว่า 'ซึ่ง' ไม่สมเหตุสมผล
Capt.Krusty

176

is.element() ทำให้รหัสอ่านง่ายขึ้นและเหมือนกันกับ %in%

v <- c('a','b','c','e')

is.element('b', v)
'b' %in% v
## both return TRUE

is.element('f', v)
'f' %in% v
## both return FALSE

subv <- c('a', 'f')
subv %in% v
## returns a vector TRUE FALSE
is.element(subv, v)
## returns a vector TRUE FALSE

6
is.element(x, y) is identical to x %in% yฉันรู้ว่าเอกสารกล่าวว่า แต่ฉันไม่รู้ว่าทำไมใช้is.elementsงานได้เมื่อผสมจำนวนเต็มและตัวเลขและ%in%ไม่
pomber

@pomber: คุณช่วยยกตัวอย่างเรื่องนี้ได้มั้ย
ลูกโซ่

@pomber แก้ไขหรือไม่
vasili111

2
ความสามารถในการอ่านที่เหนือกว่าis.element()เทียบได้กับ%in%ความรู้สึกส่วนตัว กรณีสามารถทำให้ผู้ดำเนินการมัดสามารถอ่านได้มากขึ้นเพราะมันกำจัดความคลุมเครือในลำดับของการขัดแย้ง apple in fruitทำให้รู้สึกfruit in appleไม่ is.element(apple, fruit)หรือis.element(fruit, apple)อาจถูกต้องขึ้นอยู่กับการใช้งานis.elementฟังก์ชั่น
rileymcdowell

70

ฉันจะจัดกลุ่มตัวเลือกตามผลลัพธ์ สมมติว่าเวกเตอร์ต่อไปนี้เป็นตัวอย่างทั้งหมด

v <- c('z', 'a','b','a','e')

สำหรับการตรวจสอบสถานะ:

%ใน%

> 'a' %in% v
[1] TRUE

ใด ๆ ()

> any('a'==v)
[1] TRUE

is.element ()

> is.element('a', v)
[1] TRUE

สำหรับการค้นหาสิ่งที่เกิดขึ้นครั้งแรก:

การจับคู่()

> match('a', v)
[1] 2

สำหรับการค้นหาสิ่งที่ปรากฏทั้งหมดเป็นเวกเตอร์ของดัชนี:

ที่()

> which('a' == v)
[1] 2 4

สำหรับการค้นหาสิ่งที่เกิดขึ้นทั้งหมดเป็นเวกเตอร์เชิงตรรกะ :

==

> 'a' == v
[1] FALSE  TRUE FALSE  TRUE FALSE

แก้ไข: การลบgrep ()และgrepl ()จากรายการด้วยเหตุผลที่กล่าวถึงในความคิดเห็น


6
ตามที่แสดงความคิดเห็นไว้แล้วที่นี่และที่นี่อย่าใช้grep()หรือแสดงความคิดเห็นเพื่อค้นหาการแข่งขันที่แน่นอน
Uwe

69

ใด ๆ ()ฟังก์ชั่นทำให้การอ่านรหัส

> w <- c(1,2,3)
> any(w==1)
[1] TRUE

> v <- c('a','b','c')
> any(v=='b')
[1] TRUE

> any(v=='f')
[1] FALSE

9
ระวังนี้มีลักษณะการทำงานที่แตกต่างจาก%in%: any(1==NA)ผลตอบแทนNAที่ผลตอบแทน1 %in% NA FALSE

@ user3603486: ผลตอบแทนany(1==NA, na.rm=TRUE) FALSE
AkselA

36

คุณสามารถใช้%in%โอเปอเรเตอร์:

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false

19

นอกจากนี้เพื่อค้นหาตำแหน่งขององค์ประกอบ "ซึ่ง" สามารถใช้เป็น

pop <- c(3,4,5,7,13)

which(pop==13)

และเพื่อค้นหาองค์ประกอบที่ไม่มีอยู่ในเวกเตอร์เป้าหมายเราอาจทำสิ่งนี้:

pop <- c(1,2,4,6,10)

Tset <- c(2,10,7)   # Target set

pop[which(!(pop%in%Tset))]

whichบางครั้งก็เป็นที่นิยมมากกว่าเพราะมันให้ตำแหน่งการจับคู่ทั้งหมด (เป็นอาร์เรย์) ซึ่งแตกต่างจากmatchคุณ แม้ว่านี่อาจจะไม่ใช่สิ่งที่ OP ร้องขอ แต่แตกต่างจากstackoverflow.com/questions/1169388/…
Fizz

2
ทำไมต้องกังวลwhichถ้าคุณแค่ต้องการค้นหาองค์ประกอบที่ไม่อยู่ในนั้นTset? คุณสามารถสร้างดัชนีpopได้โดยตรง pop[!pop%in%Tset]
Houshalter

13

ฉันชอบ grep () และ grepl () เพื่อจุดประสงค์นี้

grep () ส่งคืนเวกเตอร์ของจำนวนเต็มซึ่งระบุตำแหน่งที่ตรงกัน

yo <- c("a", "a", "b", "b", "c", "c")

grep("b", yo)
[1] 3 4

grepl () ส่งคืนโลจิคัลเวกเตอร์ที่มี "TRUE" ที่ตำแหน่งของการจับคู่

yo <- c("a", "a", "b", "b", "c", "c")

grepl("b", yo)
[1] FALSE FALSE  TRUE  TRUE FALSE FALSE

ฟังก์ชันเหล่านี้คำนึงถึงขนาดตัวพิมพ์


10
โดยค่าเริ่มต้นgrepจะใช้นิพจน์ทั่วไปเป็นองค์ประกอบแรกดังนั้นในการจับคู่ที่ตรงกัน"b"ทั้งใช้^e$หรือเพิ่ม, fixed=TRUE)
reinierpost

10
อย่าใช้ regex สำหรับการแข่งขันที่แน่นอน นี่เป็นอันตรายและอาจมีผลลัพธ์ที่ไม่คาดคิด
David Arenburg

9
ใช่นี่เป็นความคิดที่แย่ไม่มีดีและเลวมาก - ไร้ประสิทธิภาพและรับประกันว่าจะพัง เช่นmyvar <- 'blah'; grepl('b', myvar, fixed=TRUE)จะกลับมาTRUEแม้ว่า 'B' myvarไม่ได้อยู่ใน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.