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


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.