একটি লজিকাল শর্ত দ্বারা 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

আমি যা চাই তা হল একটি নতুন ডেটা ফ্রেম যা দেখতে একই রকম তবে কেবলমাত্র একটি সেল_ টাইপের ডেটা রয়েছে। উদাহরণস্বরূপ সাবসেট / সারি নির্বাচন করুন যা সেল টাইপ "hesc" রয়েছে:

   expr_value     cell_type
1    5.929771          hesc
2    5.873096          hesc
3    5.665857          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"    

যদি মূল ডেটা ফ্রেমটিকে "এক্সপ্রেস" বলা হয় তবে এটি ফলাফল হিসাবে ভুল ফর্ম্যাটে আপনি দেখতে পাচ্ছেন gives

উত্তর:


210

একটি 'সেল_ টাইপ' (যেমন 'হেস্ক') অনুযায়ী সারি নির্বাচন করতে , ব্যবহার করুন ==:

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

দুই বা ততোধিক পৃথক 'সেল_ টাইপ' অনুযায়ী সারি নির্বাচন করতে, (যেমন 'হেস্ক' বা 'বিজে ফাইব্রোব্লাস্ট') ব্যবহার করুন %in%:

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

28
সচেতন থাকুন যে ==ফাংশনটি কোনও এনএ রেকর্ডের পাশাপাশি "হেস্ক" তুলবে, তবে তা %in%করবে না।
ম্যাট পার্কার

ভাবছি এখন কি এই কাজ করে? আমি এইভাবে শর্তের ভিত্তিতে ডেটাফ্রেম সাবসেট করতে সক্ষম হইনি।
সুমান্থ লাজারাস

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 ফাংশন ব্যবহার করতে ভাল, এবং বিশেষ করে যুক্তির অ standar ঘ মূল্যায়ন। উপসেট অপ্রত্যাশিত consequen CES থাকতে পারে । "
আলেকসন্দর দিমিত্রভ

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পাশাপাশি কোনও রেকর্ড বাছাই করবে ! সুতরাং, প্রযোজ্য নয়। যেহেতু এটি সত্য বলে মনে হয়েছিল তার ফলস্বরূপ যে NAফিল্টারকৃত কলামে এক্সপ্রেস ডেটাফ্রেম নেই । যদি সেখানে থাকে NAতবে আপনার উপায়টি আমি আগে বলেছি তেমন প্রযোজ্য নয়।
এরদোগান সিইভিভার

26

আপনি dplyrপ্যাকেজটি ব্যবহার করতে পারেন :

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

5

কারও মনে হয় না যে এটি কোনও ফাংশন অন্তর্ভুক্ত করেছে। এটি ফিল্টারিংয়ের জন্যও কার্যকর প্রমাণ করতে পারে।

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

এটি এনএও পরিচালনা করবে এবং ফলাফল ডেটা ফ্রেম থেকে এগুলিকে ফেলে দেবে।

এটিকে 9840 বাই 24 ডেটাফ্রেমে 50000 বার চালানো, দেখে মনে হচ্ছে কোন পদ্ধতিটিতে% পদ্ধতিতে% এর তুলনায় 60% দ্রুত রান সময় রয়েছে?


4

আমি একটি ডেটাফ্রেমে কাজ করছি এবং সরবরাহিত উত্তরগুলির সাথে ভাগ্য নেই, এটি সর্বদা 0 টি সারি ফিরে আসে, তাই আমি গ্রেপল খুঁজে পেয়েছি এবং ব্যবহার করেছি:

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

যা মূলত আমার ডাটাফ্রেমকে কেবল সারিতে ট্রান্সমিট দিকনির্দেশ কলামে "ডাউনলিঙ্ক" ধারণ করে ছাঁটাই করে। পিএস যদি কেউ অনুমান করতে পারে যে কেন আমি প্রত্যাশিত আচরণটি দেখছি না, দয়া করে একটি মন্তব্য দিন।

বিশেষত মূল প্রশ্নের:

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

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

3

কখনও কখনও আপনি যে কলামটি ফিল্টার করতে চান তা কলাম সূচক 2 এর চেয়ে আলাদা অবস্থানে উপস্থিত হতে পারে বা একটি পরিবর্তনশীল নাম থাকতে পারে have

এই ক্ষেত্রে, আপনি কেবল যে কলামের নামটি ফিল্টার করতে চান তা উল্লেখ করতে পারেন:

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

এটি NAপাশাপাশি কোনও রেকর্ড বাছাই করবে ! সুতরাং, প্রযোজ্য নয়।
এরদোগান সিইভিভার

0

আমরা ডেটা টেবিল লাইব্রেরি ব্যবহার করতে পারি

  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.