การกรองดาต้าเฟรม


12

ยังคงเรียนรู้ฟังก์ชันพื้นฐานใน R ฟังก์ชั่นชุดย่อยดูเหมือนว่าจะกรองตามเงื่อนไขตามคอลัมน์เดียวโดยมีหรือไม่มีเงื่อนไขหลายข้อ?

ฉันจะกรองข้อมูลจาก dataframe ได้อย่างไร

  1. เมื่อคุณได้รับเงื่อนไขที่หลากหลาย

  2. เมื่อเงื่อนไขจะต้องมีการใช้ข้ามคอลัมน์ที่มีอยู่

ตัวอย่าง: กำหนดกรอบข้อมูลที่มี

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

บอกว่าฉันต้องการที่จะกรอง dataframe นี้เพื่อให้เฉพาะชื่อที่ใด ๆ ของ D1 ถึง D4 เป็น 'E' แล้วฉันควรจะมี

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

สมมติว่า D1 เป็นรายการคอลัมน์ขนาดใหญ่วิธีที่แนะนำในการดำเนินการตัวกรองนี้เป็นอย่างไร ขอบคุณ

คำตอบ:


26

หากคุณต้องการรวมตัวกรองหลายตัวในฟังก์ชั่นชุดย่อยให้ใช้ตัวดำเนินการเชิงตรรกะ

 subset(data, D1 == "E" | D2 == "E")

จะเลือกแถวเหล่านั้นที่คอลัมน์ D1 หรือคอลัมน์ D2 มีค่า "E" ดูที่หน้าช่วยเหลือสำหรับตัวดำเนินการทางตรรกะที่มีอยู่:

 > ?"|"

สำหรับคำถามที่สองสิ่งที่คุณต้องการคือกรองแถว สามารถทำได้ในวิธีต่อไปนี้

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

อาร์กิวเมนต์แรกที่ใช้จะทำให้คอลัมน์ที่เราต้องการกรองนั้นเกินพอดี อาร์กิวเมนต์ที่สองคือ 1 ซึ่งหมายความว่าเราวนลูปผ่านแถวของข้อมูล อาร์กิวเมนต์ที่สามไม่มีชื่อฟังก์ชันหนึ่งบรรทัดซึ่งส่งกลับค่าTRUEหากมี "E" อยู่ในแถวและFALSEหากไม่มี "E"

ผลลัพธ์ของฟังก์ชัน Apply จะเป็น vector selแบบลอจิคัลซึ่งมีความยาวเท่ากับจำนวนแถวในข้อมูล จากนั้นเราใช้เวกเตอร์นี้เพื่อเลือกแถวที่จำเป็น

ปรับปรุง

เดียวกันสามารถทำได้ด้วย grep:

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

ใน R grep ที่มีอาร์กิวเมนต์เริ่มต้นส่งคืนจำนวนองค์ประกอบในเวกเตอร์ที่ให้ซึ่งมีรูปแบบการจับคู่


2
anyอีกฟังก์ชันที่มีประโยชน์คือ ตัวอย่างเช่นหากคุณต้องการตรวจสอบว่าอย่างน้อยหนึ่งองค์ประกอบของเวกเตอร์คือ= 10คุณสามารถเขียน ( any(v==10))
โก้

@nico ใช่ แต่10% ใน% vมี 9 ตัวอักษรและแตกต่างกับ10 ใด ๆ :) แม้ว่าเวกเตอร์ที่เป็นตัวเลขจะเป็นการดีกว่าถ้าใช้ความเท่าเทียมกันเนื่องจาก R เป็นสมาร์ทและถ้าข้อมูลของคุณเป็นจำนวนเต็มผสมกับจำนวนจริงมันจะรับรู้ได้อย่างถูกต้องว่าคุณมี 10 ในชุดข้อมูลของคุณ
mpiktas

สิ่งที่เกี่ยวกับกรณีสำหรับการแสดงออกปกติ? สมมติว่าคุณไม่ต้องการทำงานกับการจับคู่ที่ตรงกันใช่หรือไม่ พวกเขามีบางสิ่งบางอย่างใกล้ ~ ~ ในภาษาอื่น ๆ ? สิ่งที่ใกล้เคียงกับนิพจน์นั้นที่สุดใน R
eastafri

@Biorelated ดูgrepและagrepและเอกสารที่เกี่ยวข้องใน POSIX 1003.2 หรือ regex ที่เข้ากันได้กับ Perl
chl

@Biorelated ฉันได้อัปเดตคำตอบพร้อมตัวอย่าง grep แล้ว
mpiktas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.