"OR" ব্যবহার করে ডেটা-ফ্রেমটি সাবসেট করার জন্য একাধিক শর্তগুলি কীভাবে একত্রিত করবেন?


174

আমি আর-তে একটি ডেটা ফ্রেম পেয়েছি two আমি দুটি ভিন্ন কলামে দুটি ভিন্ন শর্ত চেষ্টা করতে চাই, তবে আমি চাই এই শর্তগুলি অন্তর্ভুক্তিযুক্ত হোক। অতএব, আমি শর্তগুলি একত্রিত করতে "OR" ব্যবহার করতে চাই। আমি যখন "AND" শর্তটি ব্যবহার করতে চেয়েছিলাম তখন আমি অনেকগুলি সাফল্যের সাথে নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করেছি।

my.data.frame <- data[(data$V1 > 2) & (data$V2 < 4), ]

তবে উপরোক্ত ক্ষেত্রে কীভাবে 'ওআর' ব্যবহার করতে হয় তা আমি জানি না।

উত্তর:


249
my.data.frame <- subset(data , V1 > 2 | V2 < 4)

একটি বিকল্প সমাধান যা এই ফাংশনটির আচরণের অনুকরণ করে এবং কোনও ফাংশন বডির মধ্যে অন্তর্ভুক্তির জন্য আরও উপযুক্ত:

new.data <- data[ which( data$V1 > 2 | data$V2 < 4) , ]

কিছু লোক whichপ্রয়োজন হিসাবে ব্যবহার না করায় সমালোচনা করে , তবে এটি NAমানগুলি অযাচিত ফলাফলগুলি পিছনে ফেলে দেওয়া থেকে বিরত রাখে । সমাপ্তি (। V1 বা V2 তে কোনও এনএ-এর সারিগুলি ফেরত পাঠানো নয়) উপরে উল্লিখিত দুটি বিকল্পের মধ্যে whichএই হবে:

 new.data <- data[ !is.na(data$V1 | data$V2) & ( data$V1 > 2 | data$V2 < 4)  , ]

দ্রষ্টব্য: আমি বেনামে অবদানকারীকে ধন্যবাদ জানাতে চাইছি যে উপরের কোডটিতে ত্রুটি তত্ক্ষণাত্ সমাধান করার চেষ্টা করেছিল, এটি একটি সংশোধন যা মডারেটররা প্রত্যাখ্যান করেছিল। আমি প্রথমে সংশোধন করার সময় একটি অতিরিক্ত ত্রুটি ছিল যা আমি লক্ষ্য করেছি। শর্তসাপেক্ষে যে শুল্কটি এনএ মানগুলির জন্য যাচাই করে তা যদি প্রথমে আমার ইচ্ছা অনুযায়ী পরিচালনা করা দরকার তবে যেহেতু ...

> NA & 1
[1] NA
> 0 & NA
[1] FALSE

'এবং' ব্যবহার করার সময় আর্গুমেন্টের অর্ডার বিষয়টি বিবেচনা করতে পারে।


1
এটি সর্বাধিক ভোট দেওয়া প্রশ্ন এবং তারপরে
একটিটি

1
সুবিধাটি কমপ্যাক্টনেস এবং বোধগম্যতা। অসুবিধাটি হ'ল ফাংশন বিল্ডিংয়ের কাজে ইউটিলিটির অভাব। যদি কেউ এটির সাথে এটির প্রতিরূপ তৈরি করতে চায় [তবে whichঅতিরিক্ত !is.naআবদ্ধতা আবদ্ধ বা ব্যবহার করতে হবে।
IRTFM

'কোনটি' প্রয়োজনীয় এবং তা না হলে কেন আপনি এটি ব্যবহার করেন?
ক্লাব

1
এটি "প্রয়োজনীয়" নয়, তবে আপনি যদি এটিকে ছেড়ে দেন তবে আপনি আলাদা ফলাফল পেতে পারেন which। ভি 1 এবং ভি 2 উভয়ই এনএ হলে আপনি যদি এটিকে ছেড়ে যান তবে আপনি সেই অবস্থানে এনএ'র একটি সারি পাবেন which। আমি বড় ডেটাসেটের সাথে কাজ করি এবং এমনকি এনএ এর অপেক্ষাকৃত ছোট শতাংশই আমার স্ক্রিনটি জাঙ্ক আউটপুট দিয়ে সত্যিই পূরণ করবে। কিছু লোক এটি একটি বৈশিষ্ট্য বলে মনে করেন। আমি না।
আইআরটিএফএম

এই শর্তাবলীর পাশাপাশি কাঙ্ক্ষিত সারিগুলির জন্য প্যাটার্ন মেলানোর জন্য আপনি কীভাবে greplবা এর grepসাথে কোনও কল অন্তর্ভুক্ত করবেন?
ব্যবহারকারী5359531

31

আপনি "|" খুঁজছেন Http://cran.r-project.org/doc/manouts/R-intro.html# লজিক্যাল- ভেক্টর দেখুন

my.data.frame <- data[(data$V1 > 2) | (data$V2 < 4), ]

এটি NAকোনও ডেটাফ্রেমে অস্তিত্বের পক্ষে দৃ NOT় নয়:vc <- data.frame(duzey=factor(c("Y","O","Y","D","Y","Y","O"), levels=c("D","O","Y"), ordered=TRUE), cinsiyet=c("E","E","K",NA,"K","E","K"), yas=c(8,3,9,NA,7,NA,6), Not=c(NA,1,1,NA,NA,2,1)); vc; vc[vc$cinsiyet == "E" | vc$Not < 4,]; vc[vc$cinsiyet == "E" & vc$Not < 2,]
এরদোগান সিইভি

17

কেবল সম্পূর্ণতার স্বার্থে, আমরা অপারেটরগুলি [এবং [[:

set.seed(1)
df <- data.frame(v1 = runif(10), v2 = letters[1:10])

বিভিন্ন বিকল্প

df[df[1] < 0.5 | df[2] == "g", ] 
df[df[[1]] < 0.5 | df[[2]] == "g", ] 
df[df["v1"] < 0.5 | df["v2"] == "g", ]

df $ নামটি df এর সমতুল্য [["নাম", সঠিক = FALSE]]

ব্যবহার dplyr:

library(dplyr)
filter(df, v1 < 0.5 | v2 == "g")

ব্যবহার sqldf:

library(sqldf)
sqldf('SELECT *
      FROM df 
      WHERE v1 < 0.5 OR v2 = "g"')

উপরের বিকল্পগুলির জন্য আউটপুট:

          v1 v2
1 0.26550866  a
2 0.37212390  b
3 0.20168193  e
4 0.94467527  g
5 0.06178627  j

1
আপনি কীভাবে এটি 1 এবং শর্ত এবং 3 বা শর্তগুলির জন্য কাজ করবেন উদাহরণস্বরূপ: my.data.frame <- ডেটা [ডেটা $ V3> 10 & ((ডেটা $ ভি 1> 2) | (ডেটা $ ভি 2 <4) | (ডেটা $ ভি 4 <5),]। আমি যখন এটি করি এটি কার্যকর হয় না
আর গুরু

1
কি দারুন! sqldfপ্যাকেজ খুব ভাল। খুব সহজেই যখন subset()কিছুটা বেদনাদায়ক হয়ে
ওঠে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.