আমি কীভাবে একটি ডেটা ফ্রেমে সারিগুলি মুছব?


224

আমার কাছে "মাইডাটা" নামে একটি ডেটা ফ্রেম রয়েছে যা দেখতে এটির মতো দেখাচ্ছে:

   A  B  C   D 
1. 5  4  4   4 
2. 5  4  4   4 
3. 5  4  4   4 
4. 5  4  4   4 
5. 5  4  4   4 
6. 5  4  4   4 
7. 5  4  4   4 

আমি সারি 2,4,6 মুছতে চাই। উদাহরণস্বরূপ, এটি পছন্দ করুন:

   A  B  C   D
1. 5  4  4  4 
3. 5  4  4  4 
5. 5  4  4  4 
7. 5  4  4  4 

12
এছাড়াও, আপনি ডেটা নিয়ে কাজ করার জন্য কিছু সাধারণ পরিভাষার সাথে পরিচিত হতে চাইতে পারেন। এটিকে সাধারণত সাবসেটিং হিসাবে উল্লেখ করা হয়, আপনি যদি গুগলে "আর সাবসেট ডেটা ফ্রেম" অনুসন্ধান করেন তবে আপনি খুব সহায়ক ইউসিএলএ আর এফএকিউ পৃষ্ঠাতে যাবেন । স্ট্যাকওভারফ্লোতে স্বাগতম!
A5C1D2H2I1M1N2O1R2T1

@ এমআরদ্ব্বাবের দুর্দান্ত উত্তর ছাড়াও, বুলিয়ান ভেক্টরগুলি ব্যবহার করে সাবসেট করার কয়েকটি অতিরিক্ত উপায় যুক্ত করা হয়েছে।
পল হিমস্ট্র্রা

2
@ A5C1D2H2I1M1N2O1R2T1: আর সাবসেটিংয়ের জন্য UCLA FAQ সরানো হয়েছে। এখন এটি এখানে
মাইক শেরিল 'ক্যাট রিকল'

উত্তর:


340

মূল ধারণাটি হ'ল আপনি যে সারিগুলি সরাতে চান তার একটি সেট তৈরি করুন এবং সেই সেটটির পরিপূরক বজায় রাখুন।

আর-তে, কোনও সেটের পরিপূরক '-' অপারেটর দিয়ে দেয়।

সুতরাং, ধরে data.frameনেওয়া যাকে বলা হয় myData:

myData[-c(2, 4, 6), ]   # notice the -

অবশ্যই, myDataযদি আপনি এই সারিগুলি পুরোপুরি ফেলে দিতে চান তবে "পুনরায় নিয়োগ" করতে ভুলবেন না --- অন্যথায়, আর কেবল ফলাফলগুলি মুদ্রণ করে।

myData <- myData[-c(2, 4, 6), ]

59
,সেখানে নোট করতে ভুলবেন না! ;)
স্টিভেন জিউরিস

5
যদি আপনার ডেটাফ্রেমটি কেবল একটি কলাম হয়। দেখে মনে হচ্ছে এটি পুরো কাঠামোটি ফেলে দেয় এবং মানগুলির একটি ভেক্টরকে আউটপুট দেয়
Road_to_quantdom

6
@road_to_quantdom, drop = FALSEসেখানে একটি যুক্ত করুন ।
A5C1D2H2I1M1N2O1R2T1

4
"আর-তে, কোনও সেটের পরিপূরক '-' অপারেটর দ্বারা দেওয়া হয়" -> এটি একটি খুব বিভ্রান্তিকর শব্দ। নেতিবাচক সূচকগুলি মুছে ফেলা হয় এবং এটি হ'ল পরিপূরকের কোনও ধারণা নেই। আপনি যদি লজিকাল দিয়ে কাজ করেন এবং -এটি ব্যবহার করার চেষ্টা করেন তবে এটি কাজ করবে না, কারণ লজিকালের পরিপূরক অপারেটর !। সারিগুলিতে সি (2,4,6) এর পরিপূরকটি বরং সেটডিফ (সি (2,4,6), 1: নরো (মাইডাটা) হবে, যা সি নয় (-2, -4, -6) , যদিও উভয়ই একই সারিটি যখন ব্যবহার করা হয় তখন ফল দেয় [
Asac

2
@ স্পেলডোসা myData[-c(2, 4, 6),,drop=F],। আসলে, আমি আপনাকে পরামর্শ দিচ্ছি যে আপনি সর্বদা কোনও ম্যাট্রিক্স অ্যাক্সেসের ,drop=Fঠিক আগে ]inোকান।
অ্যারন ম্যাকডেইড

82

আপনি তথাকথিত বুলিয়ান ভেক্টরের সাথেও কাজ করতে পারেন, ওরফে logical:

row_to_keep = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)
myData = myData[row_to_keep,]

নোট করুন !অপারেটর একটি নোট হিসাবে কাজ করে, অর্থাত !TRUE == FALSE:

myData = myData[!row_to_keep,]

@ মিঃবাবের উত্তরের (+1 বিটিডাব্লু :)) এর তুলনায় এটি কিছুটা জটিল বলে মনে হচ্ছে তবে উড়তে একটি যৌক্তিক ভেক্টর তৈরি করা যেতে পারে, যেমন একটি কলামের মান একটি নির্দিষ্ট মানকে ছাড়িয়ে যায়:

myData = myData[myData$A > 4,]
myData = myData[!myData$A > 4,] # equal to myData[myData$A <= 4,]

আপনি বুলিয়ান ভেক্টরকে সূচকগুলির একটি ভেক্টরে রূপান্তর করতে পারেন:

row_to_keep = which(myData$A > 4)

পরিশেষে, খুব ঝরঝরে কৌশল হল আপনি এই ধরণের সাবসেটিংটি কেবল নিষ্কাশনের জন্যই নয়, নিয়োগের জন্যও ব্যবহার করতে পারেন:

myData$A[myData$A > 4,] <- NA

যেখানে কলাম Aনির্ধারিত NA(সংখ্যা নয়) যেখানে A4 এর বেশি হয়।


আপনি যদি তাদের বাদ দিতে চান? আপনার উদাহরণস্বরূপ 3 নম্বরে, যদি আপনি ক্ষয় হন
গ্যাব্রিয়েলমন্টেনিগ্রো

61

সারি নম্বর দ্বারা মুছে ফেলাতে সমস্যা

দ্রুত এবং নোংরা বিশ্লেষণের জন্য, আপনি শীর্ষের উত্তর অনুসারে একটি ডাটা.ফ্রেম সারি মুছে ফেলতে পারেন। অর্থাত,

newdata <- myData[-c(2, 4, 6), ] 

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

উদাহরণস্বরূপ, কল্পনা করুন যে আপনি কোনও ডেটাসেট আমদানি করেছেন এবং মুছে ফেলতে চান এমন সারিগুলির সারি সংখ্যাগুলি সনাক্ত করে ডেটা পরীক্ষা করে এবং সারিগুলির সারি সংখ্যা চিহ্নিত করার পরে সংখ্যাসূচক অবস্থান অনুসারে সারিগুলি মুছে ফেলেছেন। যাইহোক, পরে কিছু সময়ে, আপনি কাঁচা ডেটাতে যান এবং চারপাশে একবার দেখুন এবং ডেটাটিকে পুনরায় অর্ডার করুন। আপনার সারি মোছার কোডটি এখন ভুল সারিগুলি মুছে ফেলবে, এবং আরও খারাপ এটি হ'ল আপনাকে সতর্ক করে যে কোনও ত্রুটি হওয়ার সম্ভাবনা নেই।

আরও ভাল কৌশল

একটি আরও ভাল কৌশল হ'ল সারিটির স্থিতিশীল এবং স্থিতিশীল বৈশিষ্ট্যের উপর ভিত্তি করে সারিগুলি মোছা। উদাহরণস্বরূপ, যদি আপনার একটি idকলাম পরিবর্তনশীল থাকে যা প্রতিটি ক্ষেত্রে স্বতন্ত্রভাবে সনাক্ত করে, আপনি এটি ব্যবহার করতে পারেন।

newdata <- myData[ !(myData$id %in% c(2,4,6)), ]

অন্যান্য সময়ে, আপনার কাছে একটি আনুষ্ঠানিক বর্জনীয় মানদণ্ড থাকবে যা নির্দিষ্ট করা যেতে পারে এবং আপনি সেই নিয়মের উপর ভিত্তি করে মামলাগুলি বাদ দিতে আর-এর অনেকগুলি সাবসেটিং সরঞ্জাম ব্যবহার করতে পারেন।


11

আপনার ডেটা ফ্রেমে আইডি কলাম তৈরি করুন বা সারি সনাক্ত করতে কোনও কলামের নাম ব্যবহার করুন। মুছে ফেলা সূচি ব্যবহার করা মোটেও উপযুক্ত নয়।

subsetনতুন ফ্রেম তৈরি করতে ফাংশনটি ব্যবহার করুন ।

updated_myData <- subset(myData, id!= 6)
print (updated_myData)

updated_myData <- subset(myData, id %in% c(1, 3, 5, 7))
print (updated_myData)

9

সরলিকৃত ক্রম দ্বারা:

mydata[-(1:3 * 2), ]

ক্রম অনুসারে:

mydata[seq(1, nrow(mydata), by = 2) , ]

নেতিবাচক ক্রম দ্বারা:

mydata[-seq(2, nrow(mydata), by = 2) , ]

অথবা আপনি যদি বিজোড় সংখ্যা নির্বাচন করে সাবসেট করতে চান:

mydata[which(1:nrow(mydata) %% 2 == 1) , ]

অথবা আপনি বিজোড় সংখ্যা, সংস্করণ 2 নির্বাচন করে সাবসেট করতে চান:

mydata[which(1:nrow(mydata) %% 2 != 0) , ]

অথবা আপনি এমনকি সংখ্যার ফিল্টার করে সাবসেট করতে চান:

mydata[!which(1:nrow(mydata) %% 2 == 0) , ]

বা যদি আপনি এমনকি সংখ্যাগুলি ফিল্টার করে উপসেট করতে চান তবে সংস্করণ 2:

mydata[!which(1:nrow(mydata) %% 2 != 1) , ]

5

কর্মচারী.ডাটা থেকে ড্যান মুছুন - নতুন ডেটা.ফ্রেম পরিচালনা করার দরকার নেই।

employee.data <- subset(employee.data, name!="Dan")

0

সূচি অনুসারে একটি সারি সরানোর জন্য এখানে একটি দ্রুত এবং নোংরা ফাংশন।

removeRowByIndex <- function(x, row_index) {
  nr <- nrow(x)
  if (nr < row_index) {
    print('row_index exceeds number of rows')
  } else if (row_index == 1)
  {
    return(x[2:nr, ])
  } else if (row_index == nr) {
    return(x[1:(nr - 1), ])
  } else {
    return (x[c(1:(row_index - 1), (row_index + 1):nr), ])
  }
}

এটির প্রধান ত্রুটি এটিই যে সারি_আইডেক্স আর্গুমেন্ট মানগুলির ভেক্টর হওয়ার আর প্যাটার্নটি অনুসরণ করে না। আমি এটি লেখার এবং পরীক্ষার জন্য কয়েক মিনিট ব্যয় করেছি এবং অন্যান্য কয়েক সপ্তাহে কেবল আর ব্যবহার শুরু করেছি বলে অন্যান্য সমস্যা হতে পারে। এ সম্পর্কে কোনও মন্তব্য এবং উন্নতি খুব স্বাগত হবে!


0

সম্পূর্ণতার জন্য, আমি যুক্ত করব যে এটি dplyrব্যবহারের পাশাপাশিও করা যেতে পারে slice। এটি ব্যবহারের সুবিধা হ'ল এটি একটি পাইপযুক্ত ওয়ার্কফ্লোয়ের অংশ হতে পারে।

df <- df %>%
  .
  .
  slice(-c(2, 4, 6)) %>%
  .
  .

অবশ্যই, আপনি এটি পাইপ ছাড়াও ব্যবহার করতে পারেন।

df <- slice(df, -c(2, 4, 6))

"নয় ভেক্টর" ফরম্যাট, -c(2, 4, 6)মানে সবকিছু যে পেতে না একটি সীমার ব্যবহার সারি 2, 4 এবং 6 একটি উদাহরণ এ let এর আপনি প্রথম 5 সারি সরাতে চেয়েছিলেন বলে, আপনি করতে পারে slice(df, 6:n())। আরও উদাহরণের জন্য, দস্তাবেজগুলি দেখুন

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