سؤال

أريد تصفية الصفوف من 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"]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top