تصفية Data.Frame صفوف حسب الحالة المنطقية
سؤال
أريد تصفية الصفوف من 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
ما أريده هو الحصول على إطار بيانات جديد يبدو هو نفسه ولكن لديه فقط البيانات ل One 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"، ولكنه يعطي النتائج بتنسيق خاطئ كما ترون.
المحلول
لتحديد الصفوف حسب واحد "cell_type" (مثل "HESC")، استخدم ==
:
expr[expr$cell_type == "hesc", ]
لتحديد الصفوف وفقا لشخصين أو أكثر من "Cell_Type" المختلفة، (على سبيل المثال إما "HESC" أو "BJ Fibroblast")، استخدم %in%
:
expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]
نصائح أخرى
يستخدم 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"))
السبب 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
يمكنك استخدام dplyr
صفقة:
library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")
في بعض الأحيان قد يظهر العمود الذي تريد تصفيةه في موضع مختلف عن فهرس العمود 2 أو لديك اسم متغير.
في هذه الحالة، يمكنك ببساطة إحالة اسم العمود تريد تصفية كما:
columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]
كنت أعمل على إطعام معالي ولا حظا حظا مع الإجابات المقدمة، عاد دائما 0 صفوف، لذلك وجدت ويستخدم Grepl:
df = df[grepl("downlink",df$Transmit.direction),]
والتي قلصت أساسا dataframe الخاص بي إلى الصفوف فقط التي تحتوي على "downlink" في عمود اتجاه الإرسال. ملاحظة: إذا كان بإمكان أي شخص تخمين لماذا لا أرى السلوك المتوقع، فيرجى ترك تعليق.
خصيصا للسؤال الأصلي:
expr[grepl("hesc",expr$cell_type),]
expr[grepl("bj fibroblast|hesc",expr$cell_type),]
لا يبدو أن أحد قد شملت الوظيفة. يمكن أن يثبت أيضا مفيدة للتصفية.
expr[which(expr$cell == 'hesc'),]
سيؤدي ذلك أيضا إلى التعامل مع NAS وإسقاطها من الإطار DataRame الناتج.
تشغيل هذا على 9840 بنسبة 24 dataframe 50000 مرة، يبدو أن الطريقة التي تحتوي على وقت تشغيل أسرع بنسبة 60٪ من الأسلوب٪ في٪.
يمكننا استخدام البيانات.
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"]