กรอง data.frame แถวตามเงื่อนไขโลจิคัล


155

ฉันต้องการกรองแถวจากเงื่อนไขdata.frameตามลอจิคัล สมมุติว่าฉันมีกรอบข้อมูลเหมือนกัน

   expr_value     cell_type
1    5.345618 bj fibroblast
2    5.195871 bj fibroblast
3    5.247274 bj fibroblast
4    5.929771          hesc
5    5.873096          hesc
6    5.665857          hesc
7    6.791656          hips
8    7.133673          hips
9    7.574058          hips
10   7.208041          hips
11   7.402100          hips
12   7.167792          hips
13   7.156971          hips
14   7.197543          hips
15   7.035404          hips
16   7.269474          hips
17   6.715059          hips
18   7.434339          hips
19   6.997586          hips
20   7.619770          hips
21   7.490749          hips

สิ่งที่ฉันต้องการคือการได้รับ data frame ใหม่ซึ่งดูเหมือนกัน แต่มีข้อมูลสำหรับ cell_type เดียวเท่านั้น เช่นแถวย่อย / เลือกแถวที่มีประเภทเซลล์ "hesc":

   expr_value     cell_type
1    5.929771          hesc
2    5.873096          hesc
3    5.665857          hesc

หรือเซลล์ทั้งประเภท "bj fibroblast" หรือ "hesc":

   expr_value     cell_type
1    5.345618 bj fibroblast
2    5.195871 bj fibroblast
3    5.247274 bj fibroblast
4    5.929771          hesc
5    5.873096          hesc
6    5.665857          hesc

มีวิธีง่าย ๆ ในการทำเช่นนี้?

ฉันพยายามแล้ว:

expr[expr[2] == 'hesc']
# [1] "5.929771" "5.873096" "5.665857" "hesc"     "hesc"     "hesc"    

หากกรอบข้อมูลดั้งเดิมเรียกว่า "expr" แต่จะให้ผลลัพธ์ในรูปแบบที่ไม่ถูกต้องตามที่คุณเห็น

คำตอบ:


210

เพื่อเลือกแถวตามหนึ่ง 'cell_type' (เช่น 'hESC') การใช้งาน==:

expr[expr$cell_type == "hesc", ]

หากต้องการเลือกแถวตาม 'cell_type' ที่แตกต่างกันสองรายการขึ้นไป (เช่น 'hesc' หรือ 'bj fibroblast') ให้ใช้%in%:

expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]

28
โปรดทราบว่า==ฟังก์ชั่นจะรับระเบียน NA ใด ๆ เช่นเดียวกับ "hesc" ในขณะที่%in%จะไม่
Matt Parker

ฉันสงสัยว่าตอนนี้ใช้งานได้หรือไม่ ฉันไม่สามารถเซ็ตชื่อไฟล์ย่อยตามเงื่อนไขด้วยวิธีนี้
Sumanth Lazarus

85

ใช้subset(สำหรับใช้แบบโต้ตอบ)

subset(expr, cell_type == "hesc")
subset(expr, cell_type %in% c("bj fibroblast", "hesc"))

หรือดีกว่า dplyr::filter()

filter(expr, cell_type %in% c("bj fibroblast", "hesc"))

37
ระวัง! เอกสารของsubsetมีคำเตือนขนาดใหญ่: "นี่คือฟังก์ชั่นอำนวยความสะดวกไว้สำหรับการใช้การโต้ตอบสำหรับการเขียนโปรแกรมมันจะดีกว่าที่จะใช้ฟังก์ชั่น Subsetting มาตรฐานเช่น [และโดยเฉพาะอย่างยิ่งที่ไม่ได้มาตรฐานการประเมินผลงของการโต้แย้ง. ชุดย่อยสามารถมีงาน CES consequen ที่ไม่คาดคิด ."
Aleksandar Dimitrov

33

เหตุผลที่ใช้expr[expr[2] == 'hesc']ไม่ได้คือกรอบข้อมูลx[y]เลือกคอลัมน์ไม่ใช่แถว หากคุณต้องการเลือกแถวให้เปลี่ยนเป็นไวยากรณ์x[y,]แทน:

> expr[expr[2] == 'hesc',]
  expr_value cell_type
4   5.929771      hesc
5   5.873096      hesc
6   5.665857      hesc

นี้จะรับNAบันทึกใด ๆเช่นกัน! ดังนั้นจึงไม่สามารถใช้งานได้ สาเหตุที่ดูเหมือนเป็นจริงเป็นผลมาจากข้อเท็จจริงที่ว่า expr dataframe ไม่มีNAอยู่ในคอลัมน์ที่ถูกกรอง หากมีNAวิธีการของคุณไม่สามารถใช้ได้ตามที่ฉันกล่าวก่อน
Erdogan CEVHER

26

คุณสามารถใช้dplyrแพ็คเกจ:

library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")

5

ดูเหมือนว่าจะไม่มีใครรวมฟังก์ชั่นใด นอกจากนี้ยังสามารถพิสูจน์ได้ว่ามีประโยชน์สำหรับการกรอง

expr[which(expr$cell == 'hesc'),]

สิ่งนี้จะจัดการ NAs และปล่อยจาก dataframe ที่ได้

ใช้งานบน 9840 24 dataframe 50,000 ครั้งดูเหมือนว่าวิธีการใดที่มีเวลารันเร็วกว่า 60% กว่าวิธี% ใน%


4

ฉันทำงานกับ dataframe และไม่มีโชคกับคำตอบที่ให้ไว้มันส่งคืน 0 แถวเสมอดังนั้นฉันจึงพบและใช้ grepl:

df = df[grepl("downlink",df$Transmit.direction),]

ซึ่งโดยทั่วไปจะตัดดาต้าเฟรมของฉันให้เฉพาะแถวที่มี "downlink" ในคอลัมน์ทิศทางการส่ง ป.ล. ถ้าใครสามารถคาดเดาได้ว่าทำไมฉันไม่เห็นพฤติกรรมที่คาดหวังโปรดแสดงความคิดเห็น

โดยเฉพาะกับคำถามเดิม:

expr[grepl("hesc",expr$cell_type),]

expr[grepl("bj fibroblast|hesc",expr$cell_type),]

3

บางครั้งคอลัมน์ที่คุณต้องการกรองอาจปรากฏในตำแหน่งที่แตกต่างจากดัชนีคอลัมน์ 2 หรือมีชื่อตัวแปร

ในกรณีนี้คุณสามารถอ้างอิงชื่อคอลัมน์ที่คุณต้องการกรองเป็น:

columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]

นี้จะรับNAบันทึกใด ๆเช่นกัน! ดังนั้นจึงไม่สามารถใช้งานได้
Erdogan CEVHER

0

เราสามารถใช้ data.table library

  library(data.table)
  expr <- data.table(expr)
  expr[cell_type == "hesc"]
  expr[cell_type %in% c("hesc","fibroblast")]

หรือกรองโดยใช้%like%โอเปอเรเตอร์เพื่อจับคู่รูปแบบ

 expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]

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