আর-তে ডেটাফ্রেম থেকে একটি সম্পূর্ণ কলামটি সরান


267

আর-এর কোনও ডাটা.ফ্রেম থেকে কীভাবে একটি সম্পূর্ণ কলামটি সরিয়ে ফেলতে হয় কেউ জানেন? উদাহরণস্বরূপ যদি আমাকে এই ডেটা দেওয়া হয় ra ফ্রেম:

> head(data)
   chr       genome region
1 chr1 hg19_refGene    CDS
2 chr1 hg19_refGene   exon
3 chr1 hg19_refGene    CDS
4 chr1 hg19_refGene   exon
5 chr1 hg19_refGene    CDS
6 chr1 hg19_refGene   exon

এবং আমি দ্বিতীয় কলামটি মুছে ফেলতে চাই।


উত্তর:


414

আপনি এটি সেট করতে পারেন NULL

> Data$genome <- NULL
> head(Data)
   chr region
1 chr1    CDS
2 chr1   exon
3 chr1    CDS
4 chr1   exon
5 chr1    CDS
6 chr1   exon

মন্তব্যে নির্দেশিত হিসাবে, এখানে আরও কিছু সম্ভাবনা রয়েছে:

Data[2] <- NULL    # Wojciech Sobala
Data[[2]] <- NULL  # same as above
Data <- Data[,-2]  # Ian Fellows
Data <- Data[-2]   # same as above

আপনি এর মাধ্যমে একাধিক কলাম সরিয়ে ফেলতে পারেন:

Data[1:2] <- list(NULL)  # Marek
Data[1:2] <- NULL        # does not work!

ম্যাট্রিক্স-সাবসেটিং সম্পর্কে সতর্ক থাকুন যদিও আপনি কোনও ভেক্টর দিয়ে শেষ করতে পারেন:

Data <- Data[,-(2:3)]             # vector
Data <- Data[,-(2:3),drop=FALSE]  # still a data.frame

48
বা আপনি ব্যবহার করতে পারেন: ডেটা <- ডেটা [, - 2]
ইয়ান ফেলো

2
কমা দিয়ে আপনি "ড্রপ" যুক্তিটিও নিয়ন্ত্রণ করতে পারবেন, যার ফলস যখন ডেটা.ফ্রেম একটি ডেটা থাকে the ফলাফল যখন কেবলমাত্র একটি কলাম থাকে - কমা ছাড়া আপনি সর্বদা একটি ডেটা পাবেন multiple ফ্রেম একাধিক কলাম আছে কিনা বাম বা মাত্র একটি - ড্রপ [-2] নিষ্কাশন জন্য উপেক্ষা করা হবে
mdsumner

3
@ এমডিস্মনারের পক্ষে যুক্তি লাগবে Data[-2]না dropকারণ এটি সর্বদা ফিরে data.frameআসে data.frame। এবং আমি মনে করি এটি স্থানীয়করণ কলামগুলিতে data.frame(এবং এটির দ্রুত) কেবলমাত্র আরও ভাল উপায় । পরীক্ষা করে দেখুন: cars[-1](এক কর্নেল data.frame) অথবা ভাল cars[-(1:2)]: data frame with 0 columns and 50 rows
মারেক

1
আপনি ডেটা [2] <- NULL
Wojciech Sobala

11
গৌণ টিপ: একাধিক কলাম অপসারণ করার সময় Data[c(1,2)]<-list(NULL)প্রয়োজন।
মারেক

69

নামে এক বা একাধিক কলাম সরাতে, যখন কলামের নামগুলি জানা থাকে (রান-টাইমে নির্ধারিত হওয়ার বিপরীতে), আমি subset()সিনট্যাক্সটি পছন্দ করি । যেমন ডেটা-ফ্রেমের জন্য

df <- data.frame(a=1:3, d=2:4, c=3:5, b=4:6)

আপনি যে aকলামটি করতে পারতেন তা সরাতে

Data <- subset( Data, select = -a )

এবং আপনি করতে পারেন bএবং dকলামগুলি সরাতে

Data <- subset( Data, select = -c(d, b ) )

আপনি এর সাথে dএবং এর bসাথে সমস্ত কলাম সরিয়ে ফেলতে পারেন :

Data <- subset( Data, select = -c( d : b )

যেমন আমি উপরে বলেছি, এই সিনট্যাক্সটি তখনই কাজ করবে যখন কলামের নামগুলি জানা যাবে। কলামের নামগুলি প্রোগ্রামিমেটিকভাবে নির্ধারিত হয় (যখন কোনও ভেরিয়েবলের জন্য নির্ধারিত হয়) তখন এটি কাজ করবে না। আমি ?subsetডকুমেন্টেশন থেকে এই সতর্কতা পুনরুত্পাদন করব :

সতর্কতা:

এটি ইন্টারেক্টিভভাবে ব্যবহারের উদ্দেশ্যে উদ্দেশ্যে করা একটি সুবিধাজনক ফাংশন। প্রোগ্রামিংয়ের জন্য '[' 'এর মতো স্ট্যান্ডার্ড সাবসেটিং ফাংশনগুলি ব্যবহার করা আরও ভাল এবং বিশেষত যুক্তি' সাবসেট'-এর মানহীন মূল্যায়নের অপ্রত্যাশিত পরিণতি হতে পারে।


26

(সম্পূর্ণতার জন্য) আপনি যদি নাম অনুসারে কলামগুলি মুছতে চান তবে আপনি এটি করতে পারেন:

cols.dont.want <- "genome"
cols.dont.want <- c("genome", "region") # if you want to remove multiple columns

data <- data[, ! names(data) %in% cols.dont.want, drop = F]

অন্তর্ভুক্ত drop = Fনিশ্চিত করে যে ফলাফলটি এখনও একটি হতে পারে data.frameএমনকি যদি কেবলমাত্র একটি কলাম থাকে।


22

এর সাথে কাজ করার সময় পোস্ট করা উত্তরগুলি খুব ভাল data.frame। যাইহোক, এই কাজগুলি একটি স্মৃতির দৃষ্টিকোণ থেকে বেশ অদক্ষ হতে পারে। বড় ডেটা সহ, একটি কলাম সরিয়ে ফেলতে অস্বাভাবিকভাবে দীর্ঘ সময় নিতে পারে এবং / বা out of memoryত্রুটির কারণে ব্যর্থ হতে পারে । প্যাকেজ অপারেটর data.tableদিয়ে এই সমস্যার সমাধান করতে সহায়তা করে :=:

library(data.table)
> dt <- data.table(a = 1, b = 1, c = 1)
> dt[,a:=NULL]
     b c
[1,] 1 1

পার্থক্যগুলি দেখানোর জন্য আমার আরও বড় উদাহরণ স্থাপন করা উচিত। আমি এই উত্তরটি সাথে এক পর্যায়ে আপডেট করব।


3
data.table::setফাংশন ব্যবহার করা যেতে পারে data.frameসরাতে বা অবিলম্বে একটি কলাম পরিবর্তন করতে, কপি না করে সে। এখানে
জিএসি

8

এক বা একাধিক কলাম dplyr::select()এবং কিছু সহায়ক ফাংশন মুছে ফেলার জন্য বেশ কয়েকটি বিকল্প রয়েছে । সহায়ক ফাংশনগুলি দরকারী হতে পারে কারণ কারও কারও কাছে সমস্ত নির্দিষ্ট কলাম বাদ দেওয়ার নামকরণের প্রয়োজন হয় না। নোট করুন যে কলামগুলি ব্যবহার করে select()আপনাকে ড্রপ -করতে কলামের নামগুলি অগ্রাহ্য করার জন্য একটি শীর্ষস্থানীয় ব্যবহার করা উচিত ।

dplyr::starwarsকলামের নামগুলিতে কিছু বৈচিত্র্যের জন্য নমুনা ডেটা ব্যবহার করে :

library(dplyr)

starwars %>% 
  select(-height) %>%                  # a specific column name
  select(-one_of('mass', 'films')) %>% # any columns named in one_of()
  select(-(name:hair_color)) %>%       # the range of columns from 'name' to 'hair_color'
  select(-contains('color')) %>%       # any column name that contains 'color'
  select(-starts_with('bi')) %>%       # any column name that starts with 'bi'
  select(-ends_with('er')) %>%         # any column name that ends with 'er'
  select(-matches('^v.+s$')) %>%       # any column name matching the regex pattern
  select_if(~!is.list(.)) %>%          # not by column name but by data type
  head(2)

# A tibble: 2 x 2
homeworld species
  <chr>     <chr>  
1 Tatooine  Human  
2 Tatooine  Droid 

আপনি কলাম নম্বর দ্বারা ড্রপ করতে পারেন:

starwars %>% 
  select(-2, -(4:10)) # column 2 and columns 4 through 10

দুর্দান্ত উত্তর। কলামটি কীভাবে তার যে কোনও সারিতে একটি নির্দিষ্ট মান রয়েছে (যেটি উপরে আপনি প্রস্তাব করেছিলেন তার কলামের নাম নয়) কীভাবে ড্রপ করবেন সে সম্পর্কে কোনও ধারণা?
লরা কে

df [, - যা (sapply (df, ফাংশন (এক্স) যে কোনও (x == a))))]], যেখানে df আপনার ডেটা ফ্রেম এবং a আপনার নির্দিষ্ট মান, যেমন: mtcars [, - যা (sapply (mtcars, ফাংশন (এক্স) যে কোনও (x == 4%))]
নানামি

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