একটি শর্ত পূরণ করে এমন ম্যাট্রিক্সের সারি নির্বাচন করুন


144

একটি ম্যাট্রিক্স সহ আর

     one two three four
 [1,]   1   6    11   16
 [2,]   2   7    12   17
 [3,]   3   8    11   18
 [4,]   4   9    11   19
 [5,]   5  10    15   20

আমি সাবম্যাট্রিক্সটি বের করতে চাই যার সারিগুলির তিনটি কলাম = ১১ রয়েছে have এটি হ'ল:

      one two three four
 [1,]   1   6    11   16
 [3,]   3   8    11   18
 [4,]   4   9    11   19

আমি লুপ ছাড়াই এটি করতে চাই। আমি আর এ নতুন তাই সম্ভবত এটি খুব সুস্পষ্ট তবে ডকুমেন্টেশন প্রায়শই কিছুটা ক্ষুদ্র হয়।


4
প্রতিটি উত্তরের মূল ধারণাটি হ'ল যদি আপনার কিছু সূচকের সমান দৈর্ঘ্যের লজিকাল ভেক্টর / ম্যাট্রিক্স (সত্য এবং মিথ্যা) থাকে তবে আপনি কেবল সত্যবাদী কেস নির্বাচন করবেন। [ ]উত্তরের মধ্যে কোডগুলি চালান এবং আপনি এটি আরও স্পষ্ট দেখতে পাবেন।
— সাচ্চা অ্যাপসক্যাম্প

উত্তর:


160

আপনি as.data.frame () ব্যবহার করে যদি নিজের ম্যাট্রিক্সকে একটি ডেটা ফ্রেমে রূপান্তর করেন তবে এটি করা সহজ। সেক্ষেত্রে পূর্ববর্তী উত্তরগুলি (উপসেট বা এম $ তিন ব্যবহার করে) কাজ করবে, অন্যথায় তারা তা করবে না।

ম্যাট্রিক্সে ক্রিয়াকলাপটি সম্পাদনের জন্য , আপনি নাম দিয়ে একটি কলাম সংজ্ঞায়িত করতে পারেন:

m[m[, "three"] == 11,]

অথবা সংখ্যা অনুসারে:

m[m[,3] == 11,]

মনে রাখবেন যে যদি কেবল একটি সারিতে মেলে, ফলাফলটি কোনও ম্যাট্রিক্স নয়, একটি পূর্ণসংখ্যার ভেক্টর।


19
যদি আপনার ম্যাট্রিক্স রাখা দরকার হয়, তবে করুনm[m[,3] == 11,,drop=FALSE]
— জোরিস মাইস

@neilfws আমি কলামের একটি ব্যাপ্তির জন্য কিছু মান নির্ধারণ করতে চাইলে সমাধানটি কী হবে। উদাহরণস্বরূপ df <- df[!which(df$ARID3A:df$YY1 == "U"),](: YY1 ARID3A) মান রয়েছে, এখানে আমি আমার df প্রয়োগ যেখানে কলাম একটি সীমার থেকে যারা সারি সরাতে চান ইউ ।
— নবাবি

আপনি কীভাবে কলামের নাম নির্দিষ্ট করে উল্লেখ না করতে চাইলেও ম্যাট্রিক্সের সমস্ত কলামে কাজ করতে চান তা কীভাবে কাজ করবে?
— ব্যবহারকারী5359531

আরে @neilfws, আপনি কীভাবে এটিতে && বিবৃতি যুক্ত করতে পারেন? আমার একই সাথে দুটি কলামের মান পাওয়া দরকার?
— এক্সডি ডিবাগ করা

28
m <- matrix(1:20, ncol = 4) 
colnames(m) <- letters[1:4]

নিম্নলিখিত কমান্ডটি উপরের ম্যাট্রিক্সের প্রথম সারিটি নির্বাচন করবে।

subset(m, m[,4] == 16)

এবং এটি শেষ তিনটি নির্বাচন করবে।

subset(m, m[,4] > 17)

ফলাফল উভয় ক্ষেত্রেই একটি ম্যাট্রিক্স হবে। আপনি যদি কলামগুলি নির্বাচন করতে কলামের নামগুলি ব্যবহার করতে চান তবে আপনি এটির সাথে ডেটাফ্রেমে রূপান্তর বন্ধ করবেন

mf <- data.frame(m)

তারপরে আপনি নির্বাচন করতে পারেন

mf[ mf$a == 16, ]

অথবা, আপনি সাবসেট কমান্ড ব্যবহার করতে পারেন।


21

আমি dplyr প্যাকেজ ব্যবহার করে একটি সহজ পদ্ধতির চয়ন করব।

যদি ডেটাফ্রেম ডেটা হয়।

library(dplyr)
result <- filter(data, three == 11)

11

সাবসেট একটি খুব ধীর ফাংশন, এবং আমি ব্যক্তিগতভাবে এটি অকেজো বলে মনে করি।

আমি তোমাকে একটা data.frame, এরে, ম্যাট্রিক্স বলা আছে অনুমান Matসঙ্গে A, B, Cকলাম নামে হিসেবে; তাহলে আপনাকে যা করতে হবে তা হ'ল:

  • এক কলামে একটি শর্তের ক্ষেত্রে, কলাম কলাম বলতে দিন

    Mat[which(Mat[,'A'] == 10), ]

বিভিন্ন কলামে একাধিক শর্তের ক্ষেত্রে, আপনি একটি ডামি ভেরিয়েবল তৈরি করতে পারেন। অবস্থার ধরুন হয় A = 10, B = 5এবং C > 2তারপর আমরা আছে:

    aux = which(Mat[,'A'] == 10)
    aux = aux[which(Mat[aux,'B'] == 5)]
    aux = aux[which(Mat[aux,'C'] > 2)]
    Mat[aux, ]

এর সাথে গতি সুবিধাটি পরীক্ষা করে system.time, whichপদ্ধতিটি subsetপদ্ধতির চেয়ে 10x দ্রুত ।


6

যদি আপনার ম্যাট্রিক্স বলা হয় m, কেবল ব্যবহার করুন:

R> m[m$three == 11, ]

@ জুবা যদি আমি কলামের জন্য কিছু মান নির্ধারণ করতে চাই তবে সমাধানটি কী হবে। উদাহরণস্বরূপ df <- df[!which(df$ARID3A:df$YY1 == "U"),], এখানে আমি আমার df প্রয়োগ থেকে যারা সারি সরাতে চান যেখানে কলাম (ARID3A: YY1) একটি সীমার মান রয়েছেU
— নবাগত

0

যদি ডেটাসেটকে ডেটা বলা হয়, তবে সমস্ত সারি এমন এক শর্ত পূরণ করে যেখানে কলাম 'pm2.5'> 300 এর মান প্রাপ্ত হতে পারে -

ডেটা [ডেটা ['pm2.5']> 300,]

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.