আপনি কীভাবে ডেটা টেবিলের নাম অনুসারে একটি কলাম মুছবেন?


195

একটিতে "ফু" নামে একটি কলাম থেকে মুক্তি পেতে data.frame, আমি এটি করতে পারি:

df <- df[-grep('foo', colnames(df))]

যাইহোক, একবার dfকোনও data.tableবস্তুতে রূপান্তরিত হয়ে গেলে , কেবল একটি কলামটি সরানোর কোনও উপায় নেই।

উদাহরণ:

df <- data.frame(id = 1:100, foo = rnorm(100))
df2 <- df[-grep('foo', colnames(df))] # works
df3 <- data.table(df)
df3[-grep('foo', colnames(df3))] 

তবে একবার এটি কোনও data.tableবস্তুতে রূপান্তরিত হয়ে গেলে এটি আর কাজ করে না।


2
এর dtপরিবর্তে ডেটা.টিটেবলের নামকরণ করা আরও পরিষ্কার হত df3...
প্যাট্রিকটি

উত্তর:


283

নিম্নলিখিতগুলির মধ্যে fooযে কোনও ডেটা থেকে কলামটি সরিয়ে ফেলবে । টেবিল df3:

# Method 1 (and preferred as it takes 0.00s even on a 20GB data.table)
df3[,foo:=NULL]

df3[, c("foo","bar"):=NULL]  # remove two columns

myVar = "foo"
df3[, (myVar):=NULL]   # lookup myVar contents

# Method 2a -- A safe idiom for excluding (possibly multiple)
# columns matching a regex
df3[, grep("^foo$", colnames(df3)):=NULL]

# Method 2b -- An alternative to 2a, also "safe" in the sense described below
df3[, which(grepl("^foo$", colnames(df3))):=NULL]

data.table নিম্নলিখিত বাক্য গঠন সমর্থন করে:

## Method 3 (could then assign to df3, 
df3[, !"foo"]  

যদিও আপনি যদি সত্যই এর "foo"থেকে কলামটি সরিয়ে ফেলতে চেয়েছিলেন df3(কেবলমাত্র df3বিয়োগ কলামের একটি দৃশ্য মুদ্রণের বিপরীতে "foo") আপনি তার পরিবর্তে পদ্ধতি 1 ব্যবহার করতে চান।

(মনে রাখবেন যে আপনি যদি নির্ভর করে এমন কোনও পদ্ধতি ব্যবহার করেন grep()বা grepl(), এর pattern="^foo$"পরিবর্তে আপনাকে সেট করতে হবে "foo", যদি আপনি নামগুলির সাথে কলামগুলি না চান "fool"এবং "buffoon"( fooযেমন একটি স্ট্রিং হিসাবে থাকা )ও মিলছে এবং সরিয়ে ফেলতে হবে))

ইন্টারেক্টিভ ব্যবহারের জন্য কম নিরাপদ বিকল্প, জরিমানা:

পরবর্তী দুটি আইডিয়ামগুলিও কাজ করবে - যদি df3একটি কলামের মিল রয়েছে"foo" - তবে এটি যদি না ঘটে তবে সম্ভবত একটি অপ্রত্যাশিতভাবে ব্যর্থ হবে। উদাহরণস্বরূপ, অস্তিত্বহীন কলামটি অনুসন্ধান "bar"করতে আপনি যদি এর মধ্যে কোনওটি ব্যবহার করেন তবে আপনি একটি শূন্য-সারি ডেটা.ট্যাবল দিয়ে শেষ করবেন।

ফলত, তারা সত্যিই ভাল ইন্টারেক্টিভ ব্যবহারের জন্য উপযোগী হয় যেখানে এক পারে, যেমন, একটি data.table বিয়োগ সাবস্ট্রিং ধারণকারী নামের সাথে কোন কলাম প্রদর্শন করাতে চান "foo"। প্রোগ্রামিংয়ের উদ্দেশ্যে (বা আপনি যদি df3কপির (অনুলিপিগুলি এর অনুলিপি না করে আসলেই সরিয়ে ফেলতে চান ), পদ্ধতি 1, 2 এ এবং 2 বি সত্যিই সেরা বিকল্প।

# Method 4:
df3[, .SD, .SDcols = !patterns("^foo$")]

শেষ অবধি ব্যবহার করার পদ্ধতি রয়েছে with=FALSE, যদিও data.tableধীরে ধীরে এই যুক্তিটি ব্যবহার করা থেকে দূরে সরে যাচ্ছে সুতরাং এটি এখন নিরুৎসাহিত হয়েছে যেখানে আপনি এড়াতে পারবেন; এখানে সত্য দেখাচ্ছে যাতে আপনার যদি প্রয়োজন হয় তবে বিকল্পটি বিদ্যমান রয়েছে তা আপনি জানেন:

# Method 5a (like Method 3)
df3[, !"foo", with=FALSE] 
# Method 5b (like Method 4)
df3[, !grep("^foo$", names(df3)), with=FALSE]
# Method 5b (another like Method 4)
df3[, !grepl("^foo$", names(df3)), with=FALSE]

2
-grepবনাম সম্পর্কে ওপিতে আমার মন্তব্য দেখুন !grepl
জোশুয়া আলরিখ

1
@ জোশুয়া অলিরিচ - ভাল কথা। আমি grepl()ইনজ্যান্টলি চেষ্টা করেছি এবং এটি কার্যকর হয়নি, কারণ ডেটা.ট্যাবল কলামগুলি একটি লজিকাল ভেক্টর দ্বারা সূচী করা যায় না। তবে আমি এখন বুঝতে পারি যে grepl()এটি দিয়ে মুড়িয়ে কাজ করা যায় which(), যাতে এটি একটি পূর্ণসংখ্যার ভেক্টরকে ফিরিয়ে দেয়।
জোশ ও'ব্রায়েন

1
আমি এর সাথে সূচীকরণ সম্পর্কে জানতাম না data.table, তবে এটি মোড়ানো whichচালাক!
জোশুয়া উলরিখ

6
আমি এটি সম্পর্কে জানতাম না data.table; যোগ এফ আর # 1797 । তবে, পদ্ধতি 1 অন্যদের তুলনায় (প্রায়) অসীম দ্রুত। পদ্ধতি 1 কোনও কপি ছাড়াই রেফারেন্স দিয়ে কলামটি সরিয়ে দেয়। আমি সন্দেহ করি আপনি যে কোনও আকারের ডেটা.ট্যাবলের জন্য এটি 0.005 সেকেন্ডের উপরে পেয়েছেন। বিপরীতে, টেবিলটি র‌্যামের 50% এর কাছাকাছি থাকলে অন্যরা এগুলি কিছুতেই কাজ করতে পারে না কারণ তারা মুছে ফেলা ব্যতীত সমস্তটি অনুলিপি করে।
ম্যাট ডাওল

1
@ ব্যবহারকারীর 396937777 যদি আপনি কোনও অক্ষর ভেরিয়েবলের বিষয়বস্তুর উপর ভিত্তি করে একটি কলাম সরিয়ে ফেলতে চান তবে আপনি এটিকে প্রথম বন্ধনীতে আবদ্ধ করতে পারেন। অর্থাৎ। ডিএফ [, (আফু): = নুল]
ডিন ম্যাকগ্রিগোর

31

আপনি setএটির জন্যও ব্যবহার করতে পারেন , যা [.data.tableলুপগুলিতে ওভারহেড এড়িয়ে চলে :

dt <- data.table( a=letters, b=LETTERS, c=seq(26), d=letters, e=letters )
set( dt, j=c(1L,3L,5L), value=NULL )
> dt[1:5]
   b d
1: A a
2: B b
3: C c
4: D d
5: E e

আপনি যদি কলামের নামে এটি করতে চান তবে এর জন্য which(colnames(dt) %in% c("a","c","e"))কাজ করা উচিত j


2
ইন data.table1.11.8, যদি আপনি কলাম নামে এটা করতে চান, আপনি সরাসরি করতে পারবেন rm.col = c("a","b")এবংdt[, (rm.col):=NULL]
Duccio একজন

20

আমি কেবল এটি ডেটা ফ্রেমের ধরণেরভাবে করি:

DT$col = NULL

দ্রুত কাজ করে এবং যতদূর আমি দেখতে পেলাম কোনও সমস্যার কারণ নেই।

আপডেট: সর্বোত্তম পদ্ধতি যদি আপনার ডিটি খুব বড় হয় না, কারণ $<-অপারেটরটি ব্যবহার করে বস্তু অনুলিপি তৈরি করবে। তাই আরও ভাল ব্যবহার:

DT[, col:=NULL]

8

কোনও তথ্য সারণীতে মুছে ফেলার জন্য আপনার কাছে অনেকগুলি স্বতন্ত্র কলাম রয়েছে এবং আপনি সমস্ত কলামের নাম টাইপ করা এড়াতে চান এমন ক্ষেত্রে খুব সহজ বিকল্প # যত্নশীল

dt <- dt[, -c(1,4,6,17,83,104)]

এটি পরিবর্তে কলাম নম্বর অনুসারে কলামগুলি সরিয়ে ফেলবে।

এটি স্পষ্টতই দক্ষ নয় কারণ এটি ডেটা.ট্যাবিল সুবিধাগুলিকে বাইপাস করে তবে আপনি যদি ৫০০,০০০ সারি বলার চেয়ে কম কাজ করে থাকেন তবে এটি ঠিক কাজ করে



-2

আপনি যখন ব্যবহারের জন্য একটি কলামের নামটি তাদের কলামের নাম দিয়ে দিতে চান তখন এখানে একটি উপায় রয়েছে:

deleteColsFromDataTable <- function (train, toDeleteColNames) {

       for (myNm in toDeleteColNames)

       train <- train [,(myNm):=NULL]

       return (train)
}


-7

একটি ডেটা. টেবিলের জন্য, কলামটি নূলে জমা দেওয়া এটি সরিয়ে দেয়:

DT[,c("col1", "col1", "col2", "col2")] <- NULL
^
|---- Notice the extra comma if DT is a data.table

... যা এর সমতুল্য:

DT$col1 <- NULL
DT$col2 <- NULL
DT$col3 <- NULL
DT$col4 <- NULL

ডেটা.ফ্রেমের সমতুল্য হ'ল:

DF[c("col1", "col1", "col2", "col2")] <- NULL
      ^
      |---- Notice the missing comma if DF is a data.frame

প্র: ডেটা টেবিলের সংস্করণে কেন কমা রয়েছে এবং ডেটা.ফ্রেমের সংস্করণে কোনও কমা নেই?

উ: ডেটা.ফ্রেমগুলি কলামের তালিকা হিসাবে সঞ্চিত রয়েছে, আপনি কমাটি এড়িয়ে যেতে পারেন। এছাড়াও আপনি এটা যোগ করতে পারিনি, তবে তারপর আপনি তাদের একটি তালিকা নির্ধারণ করার প্রয়োজন হবে NULL, এস DF[, c("col1", "col2", "col3")] <- list(NULL)


অরুন @ data.framesযেখানে সারি এবং কলামগুলি স্যুইচ করা হবে তার কোনও পরিস্থিতি আমি ভাবতে পারি না । এটা অযৌক্তিক হবে।
duHaas

@ অরুন আমি আপনাকে ট্যাগ করেছি কারণ আপনার প্রথম মন্তব্যে মনে হয়েছিল যে আপনি এমন সময় এসেছিলেন যেগুলি আপনি কল করতে পারেন DF[column,row]তাই আমি কেবল দেখতে চেয়েছিলাম যে এই ঘটনাটি ঘটেছে কি না।
duHaas

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