নামে ডেটা ফ্রেম কলামগুলি ফেলে দিন


874

আমার কাছে অনেকগুলি কলাম রয়েছে যা আমি একটি ডেটা ফ্রেম থেকে মুছে ফেলতে চাই। আমি জানি যে আমরা এ জাতীয় কিছু ব্যবহার করে স্বতন্ত্রভাবে মুছে ফেলতে পারি:

df$x <- NULL

তবে আমি কম কমান্ড দিয়ে এটি করার আশা করছিলাম।

এছাড়াও, আমি জানি যে আমি পূর্বে ইন্টিজার ব্যবহার করে কলামগুলি ড্রপ করতে পারি:

df <- df[ -c(1, 3:6, 12) ]

তবে আমি উদ্বিগ্ন যে আমার ভেরিয়েবলগুলির আপেক্ষিক অবস্থান পরিবর্তন হতে পারে।

আর কতটা শক্তিশালী তা প্রদত্ত, আমি বুঝতে পেরেছি যে প্রতিটি কলাম এক এক করে ফেলে দেওয়ার চেয়ে ভাল উপায় হতে পারে।


13
কেউ আমাকে ব্যাখ্যা করতে পারেন যে কেন আর এর মতো সাধারণ কিছু নেই df#drop(var_name), এবং এর পরিবর্তে আমাদের এই জটিল কাজগুলি করা দরকার?
ifly6

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

উত্তর:


910

আপনি নামের একটি সাধারণ তালিকা ব্যবহার করতে পারেন:

DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
drops <- c("x","z")
DF[ , !(names(DF) %in% drops)]

অথবা, বিকল্পভাবে, আপনি নাম রাখতে পারেন এবং তাদের রেফারেন্স করার জন্য তাদের একটি তালিকা তৈরি করতে পারেন:

keeps <- c("y", "a")
DF[keeps]

সম্পাদনা: যাঁরা এখনও dropসূচক ফাংশনের যুক্তির সাথে পরিচিত নন , আপনি যদি একটি কলামকে ডেটা ফ্রেম হিসাবে রাখতে চান, আপনি:

keeps <- "y"
DF[ , keeps, drop = FALSE]

drop=TRUE(বা এটি উল্লেখ না করে) অপ্রয়োজনীয় মাত্রা ছাড়বে এবং সুতরাং কলামের মান সহ একটি ভেক্টরকে ফিরিয়ে দেবে y


19
সাবসেট ফাংশনটি আরও ভাল কাজ করে কারণ এটি একটি কলামের সাথে একটি ডেটা ফ্রেমকে ভেক্টরে রূপান্তরিত করে না
mut1na

3
@ mut1na সূচীকরণ কার্যের আর্গুমেন্ট ড্রপ = মিথ্যা পরীক্ষা করুন।
জোরিস মেজ

4
তার DF[,keeps]পরিবর্তে হওয়া উচিত নয় DF[keeps]?
lindelof

8
@ লিন্ডলফ নং এটি করতে পারে তবে আপনি যদি কেবল একটি কলামই নির্বাচন করেন তবে আপনার ডেটা ফ্রেমকে ভেক্টরে রূপান্তর করা থেকে র রাখতে আপনাকে ড্রপ = ফলস যুক্ত করতে হবে। ডেটা ফ্রেমগুলি তালিকাভুক্ত হওয়া ভুলে যাবেন না, সুতরাং তালিকা নির্বাচন (আমার মতো এক-মাত্রিক) পুরোপুরি ভাল কাজ করে এবং সর্বদা একটি তালিকা ফেরত দেয়। বা এই ক্ষেত্রে একটি ডেটা ফ্রেম, যে কারণে আমি এটি ব্যবহার করতে পছন্দ করি।
জোরিস মাইস

7
@ অজয় ​​ওহরি হ্যাঁ, এটি হবে। কমা ব্যতীত, আপনি নির্বাচনের "তালিকা" পদ্ধতিটি ব্যবহার করেন যার অর্থ আপনি যখন কোনও একক কলামটি বের করেন তখনও আপনি একটি ডেটা ফ্রেম ফেরত পাবেন। আপনি যেমন "ম্যাট্রিক্স" ব্যবহার করেন তবে আপনার সচেতন হওয়া উচিত যে আপনি যদি কেবল একটি একক কলাম নির্বাচন করেন তবে ডেটা ফ্রেমের পরিবর্তে ভেক্টর পাবেন। এড়াতে, আপনাকে ড্রপ = ফলস যুক্ত করতে হবে। যেমনটি আমার উত্তরে এবং আপনার ঠিক উপরে মন্তব্যে ব্যাখ্যা করা হয়েছে ...
জোরিস মাইস

452

এর রয়েছে subsetআপনি যদি জানেন যা কলাম যদি আপনি চান কমান্ড, দরকারী:

df <- data.frame(a = 1:10, b = 2:11, c = 3:12)
df <- subset(df, select = c(a, c))

@Hadley দ্বারা মন্তব্যের পরে আপডেট: করতে ড্রপ কলাম A, C আপনাকে যা করতে পারে:

df <- subset(df, select = -c(a, c))

3
আমি সত্যিই ইচ্ছুক আর subsetফাংশন মত "allbut = মিথ্যা", যা "inverts" নির্বাচন যখন সত্যতে সেট করা থাকে, অর্থাত্ সব কলাম বজায় একটি বিকল্প ছিল ব্যতীতselectতালিকা।
প্রসাদ চালসানী

4
@ প্রসাদ, নীচে @ জোরিসের উত্তর দেখুন। কোনও সাবসেটের মানদণ্ড ছাড়াই একটি সাবসেট হ'ল ওভারকিল। সহজভাবে চেষ্টা করুন:df[c("a", "c")]
জেডি লং

@ জেডি আমি জানতাম, তবে subsetকমান্ডটির সিনট্যাকটিক সুবিধাটি আমি পছন্দ করি যেখানে কলামের নামগুলির চারপাশে আপনার উদ্ধৃতি দেওয়ার দরকার নেই - আমি অনুমান করি যে কেবল নাম উদ্ধৃতি এড়াতে কয়েকটি অতিরিক্ত অক্ষর লিখতে আমার আপত্তি নেই:
প্রসাদ চালসানী

11
মনে রাখবেন যে subsetঅন্য ফাংশনগুলির মধ্যে আপনার ব্যবহার করা উচিত নয় ।
এরি বি ফ্রেডম্যান


196
within(df, rm(x))

সম্ভবত সবচেয়ে সহজ, বা একাধিক ভেরিয়েবলের জন্য:

within(df, rm(x, y))

অথবা যদি আপনি data.tableএর সাথে ডিল করছেন (প্রতি আপনি কীভাবে ডেটা.ট্যাবেলে নাম দিয়ে একটি কলাম মুছবেন? ):

dt[, x := NULL]   # Deletes column x by reference instantly.

dt[, !"x"]   # Selects all but x into a new data.table.

বা একাধিক ভেরিয়েবলের জন্য

dt[, c("x","y") := NULL]

dt[, !c("x", "y")]

26
within(df, rm(x))এখন পর্যন্ত সবচেয়ে পরিষ্কার সমাধান। প্রদত্ত যে এটি একটি সম্ভাবনা, প্রতিটি উত্তর প্রতিটি মাত্রার ক্রম দ্বারা অকারণে জটিল বলে মনে হচ্ছে।
মাইলস এরিকসন

2
লক্ষ্য করুন within(df, rm(x))করবে না যদি সেখানে ডুপ্লিকেট কলাম নামকরণ করা হয় কাজ xমধ্যে df
মাইকেলচিরিকো

2
@ মিশেলচিরিকো স্পষ্ট করে জানাতে, এটি উভয়টিকেই সরিয়ে দেয় তবে তথ্যের মান পরিবর্তন করে। এটির ক্ষেত্রে যদি কারও বড় সমস্যা হয় তবে এখানে একটি উদাহরণ রয়েছে: df <- data.frame(x = 1, y = 2); names(df) <- c("x", "x"); within(df, rm(x))প্রত্যাবর্তন data.frame(x = 2, x = 2)
ম্যাক্স ঘেনিস

1
@ মাইলস ইরিকসন সমস্যাটি হ'ল আপনি এমন কোনও ফাংশনের উপর নির্ভর করেন within()যা শক্তিশালী তবে এনএসই ব্যবহার করে। সহায়তা পৃষ্ঠায় থাকা নোটটি পরিষ্কারভাবে জানিয়েছে যে প্রোগ্রামিংয়ের জন্য পর্যাপ্ত যত্ন নেওয়া উচিত।
জোরিস মেয়েস

পছন্দ করেছেন
এইচএসমালে

115

আপনি এটির %in%মতো ব্যবহার করতে পারেন :

df[, !(colnames(df) %in% c("x","bar","foo"))]

1
আমি কি কিছু মিস করছি, বা এটি কার্যকরভাবে জোরিসের উত্তরের প্রথম অংশের মতো একই সমাধান? DF[ , !(names(DF) %in% drops)]
ড্যানিয়েল ফ্লেচার

9
@ ড্যানিয়েলফ্লেচার: এটি একই রকম। উত্তরের টাইমস্ট্যাম্পগুলি দেখুন। আমরা একই সময়ে উত্তর দিয়েছিলাম ... 5 বছর আগে। :)
জোশুয়া উলরিচ

5
বাদামে পূর্ণ। identical(post_time_1, post_time_2) [1] TRUE = ডি
ড্যানিয়েল ফ্লেচার

54

তালিকা (NULL) এছাড়াও কাজ করে:

dat <- mtcars
colnames(dat)
# [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
# [11] "carb"
dat[,c("mpg","cyl","wt")] <- list(NULL)
colnames(dat)
# [1] "disp" "hp"   "drat" "qsec" "vs"   "am"   "gear" "carb"

1
উজ্জ্বল! এটি প্রাকৃতিক উপায়ে একক কলামে ন্যূনাল অ্যাসাইনমেন্টটি প্রসারিত করে এবং (সম্ভবত মনে হয়) অনুলিপি করা এড়ানো যায় (যদিও আমি জানি না যে টুকরোটির নীচে কী ঘটে তাই এটি স্মৃতি ব্যবহারে আরও দক্ষ না হতে পারে ... তবে আমার কাছে স্পষ্ট মনে হয় আরও দক্ষ সিনট্যাক্টিক্যালি।)
urchin

6
আপনার তালিকার দরকার নেই (NULL), NULL যথেষ্ট UL উদাহরণস্বরূপ: ডাটা [, 4] = নুল
চাচাতো ভাই কোকেন

8
ওপির প্রশ্ন ছিল একাধিক কলাম কীভাবে মুছবেন। dat [, 4: 5] <- NULL কাজ করবে না। এইখানেই তালিকা (এনএলএল) আসে It এটি 1 বা আরও কলামের জন্য কাজ করে।
ভিনসেন্ট

নকল কলামের নাম সরিয়ে দেওয়ার চেষ্টা করার সময়ও এটি কাজ করে না।
মাইকেলচিরিকো

@ মিশেলচিরিকো আমার পক্ষে ভাল কাজ করে। হয় আপনি একই নামের সাথে কলামগুলির প্রথমটি মুছতে চান বা আপনি যে কলামটি সরাতে চান তার জন্য সূচকগুলি দিতে চাইলে একটি লেবেল দিন। এটি যদি কাজ করে না এমন উদাহরণ রয়েছে তবে আমি এটি দেখতে আগ্রহী। এটি একটি নতুন প্রশ্ন হিসাবে পোস্ট করবেন?
ভিনসেন্ট

42

আপনি যদি রেফারেন্স অনুসারে কলামগুলি মুছে ফেলতে চান এবং এর সাথে যুক্ত অভ্যন্তরীণ অনুলিপি এড়াতে চান data.framesতবে আপনি data.tableপ্যাকেজ এবং ফাংশনটি ব্যবহার করতে পারেন:=

আপনি একটি অক্ষর ভেক্টরের নামগুলি :=অপারেটরের বাম দিকে এবং NULLআরএইচএস হিসাবে পাস করতে পারেন ।

library(data.table)

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)
# or more simply  DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10) #

DT[, c('a','b') := NULL]

আপনি যদি কলটির বাইরে চরিত্রের ভেক্টর হিসাবে নামগুলি পূর্বনির্ধারিত করতে চান [তবে অবজেক্টের নামটি মোড়ানো ()বা {}এলএইচএসকে কলিংয়ের ক্ষেত্রের মধ্যে মূল্য হিসাবে মূল্যায়ন করতে বাধ্য করতে বাধ্যকরণের ক্ষেত্রের মধ্যে নয় DT

del <- c('a','b')
DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, (del) := NULL]
DT <-  <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, {del} := NULL]
# force or `c` would also work.   

এছাড়াও আপনি ব্যবহার করতে পারেন set, যা ওভারহেড এড়াতে [.data.table, এবং জন্য কাজ করে data.frames!

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)

# drop `a` from df (no copying involved)

set(df, j = 'a', value = NULL)
# drop `b` from DT (no copying involved)
set(DT, j = 'b', value = NULL)

41

গ্রেপ () একটি সংখ্যক ভেক্টরকে ফিরিয়ে দেবে এই তথ্যের ভিত্তিতে একটি সম্ভাব্য আরও শক্তিশালী কৌশল রয়েছে। আমি যদি আমার ডেটাসেটের মতো করে করি তবে আপনার চলকগুলির দীর্ঘ তালিকা থাকে তবে কিছু পরিবর্তনশীল যা ".এ" এবং অন্যদের "। বি" এর মধ্যে শেষ হয় এবং আপনি কেবল ".এ" এর সাথে শেষ হওয়া চান (পাশাপাশি) যে সমস্ত ভেরিয়েবলের কোনও প্যাটার্নের সাথে মেলে না, তাদের সাথে এটি করুন:

dfrm2 <- dfrm[ , -grep("\\.B$", names(dfrm)) ]

হাতের কেসটির জন্য, জোরিস মেইস উদাহরণটি ব্যবহার করে এটি কমপ্যাক্টের মতো নাও হতে পারে তবে এটি হবে:

DF <- DF[, -grep( paste("^",drops,"$", sep="", collapse="|"), names(DF) )]

1
যদি আমরা dropsপ্রথম স্থানে হিসাবে এটি সংজ্ঞায়িত করি তবে এটি paste0("^", drop_cols, "$")আরও সুন্দর (পড়ুন: আরও কমপ্যাক্ট) হয়ে যায় sapply:DF[ , -sapply(drops, grep, names(DF))]
মাইকেলচিরিকো

30

আর একটি dplyrউত্তর। যদি আপনার ভেরিয়েবলগুলির কিছু সাধারণ নামকরণ কাঠামো থাকে তবে আপনি চেষ্টা করতে পারেন starts_with()। উদাহরণ স্বরূপ

library(dplyr)
df <- data.frame(var1 = rnorm(5), var2 = rnorm(5), var3 = rnorm (5), 
                 var4 = rnorm(5), char1 = rnorm(5), char2 = rnorm(5))
df
#        var2      char1        var4       var3       char2       var1
#1 -0.4629512 -0.3595079 -0.04763169  0.6398194  0.70996579 0.75879754
#2  0.5489027  0.1572841 -1.65313658 -1.3228020 -1.42785427 0.31168919
#3 -0.1707694 -0.9036500  0.47583030 -0.6636173  0.02116066 0.03983268
df1 <- df %>% select(-starts_with("char"))
df1
#        var2        var4       var3       var1
#1 -0.4629512 -0.04763169  0.6398194 0.75879754
#2  0.5489027 -1.65313658 -1.3228020 0.31168919
#3 -0.1707694  0.47583030 -0.6636173 0.03983268

আপনি যদি ডেটা ফ্রেমে ভেরিয়েবলের ক্রম ছেড়ে যেতে চান তবে আপনি ব্যবহার করতে পারেন :। উদাহরণস্বরূপ, যদি আপনি ড্রপ চেয়েছিলেন var2, var3এবং সব মধ্যবর্তী ভেরিয়েবল, আপনি শুধু সঙ্গে থাকতে চাই var1:

df2 <- df1 %>% select(-c(var2:var3) )  
df2
#        var1
#1 0.75879754
#2 0.31168919
#3 0.03983268

1
অন্যান্য যে সমস্ত সুযোগগুলি আসে সেগুলি সম্পর্কে ভুলে যাবেন না select(), যেমন contains()বা matches()যা রিজেক্সকেও গ্রহণ করে।
হা_পু

23

আরেকটি সম্ভাবনা:

df <- df[, setdiff(names(df), c("a", "c"))]

অথবা

df <- df[, grep('^(a|c)$', names(df), invert=TRUE)]

2
খুব খারাপ যে এটি আরও উত্সাহিত করা হয়নি কারণ setdiffবিশেষত খুব বড় সংখ্যক কলামের ক্ষেত্রে ব্যবহার সর্বোত্তম।
সিটিব্রাউন

এর উপর অন্য একটি কোণ:df <- df[ , -which(grepl('a|c', names(df)))]
জো

23
DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
DF

আউটপুট:

    x  y z  a
1   1 10 5 11
2   2  9 5 12
3   3  8 5 13
4   4  7 5 14
5   5  6 5 15
6   6  5 5 16
7   7  4 5 17
8   8  3 5 18
9   9  2 5 19
10 10  1 5 20

DF[c("a","x")] <- list(NULL)

আউটপুট:

        y z
    1  10 5
    2   9 5
    3   8 5
    4   7 5
    5   6 5
    6   5 5
    7   4 5
    8   3 5    
    9   2 5
    10  1 5

23

Dplyr সমাধান

আমি সন্দেহ করি এটি এখানে খুব বেশি মনোযোগ পাবে, তবে আপনার যদি কলামগুলির একটি তালিকা রয়েছে যা আপনি মুছে ফেলতে চান এবং আপনি এই দলে dplyrব্যবহার করা একটি চেইনে এটি করতে চান :one_of()select

এখানে একটি সহজ, পুনরুত্পাদনযোগ্য উদাহরণ:

undesired <- c('mpg', 'cyl', 'hp')

mtcars <- mtcars %>%
  select(-one_of(undesired))

দস্তাবেজগুলি ?one_ofএখানে বা চালিয়ে পাওয়া যাবে:

http://genomicsclass.github.io/book/pages/dplyr_tutorial.html


22

আগ্রহের বাইরে, এটি আর এর এক অদ্ভুত একাধিক সিনট্যাক্সের অসঙ্গতিগুলিকে ফ্ল্যাগ করে। উদাহরণস্বরূপ একটি দ্বি-কলামের ডেটা ফ্রেম দেওয়া হয়েছে:

df <- data.frame(x=1, y=2)

এটি একটি ডেটা ফ্রেম দেয়

subset(df, select=-y)

তবে এটি ভেক্টর দেয়

df[,-2]

এগুলি সমস্ত ব্যাখ্যা করা হয়েছে ?[তবে এটি ঠিক প্রত্যাশিত আচরণ নয়। কমপক্ষে আমার পক্ষে না ...


18

dplyrএটি সম্পর্কে একটি উপায় এখানে :

#df[ -c(1,3:6, 12) ]  # original
df.cut <- df %>% select(-col.to.drop.1, -col.to.drop.2, ..., -col.to.drop.6)  # with dplyr::select()

আমি এটি পছন্দ করি কারণ ডেটা ফ্রেমের মধ্যে অবস্থান পরিবর্তন করে কলামগুলিতে টীকাকরণ এবং দৃ without়তা ছাড়াই পড়তে এবং বুঝতে আগ্রহী। এটি -উপাদানগুলি সরানোর জন্য ভেক্টরাইজড আইডিয়ম অনুসরণ করে ।


এর সাথে যুক্ত করে (১) ব্যবহারকারী মূল ডিএফ (২) ম্যাজিট্রেটরের %<>% পরিবর্তে অপারেটরকে ইনপুট অবজেক্টটি প্রতিস্থাপন করতে হবে যাতে এটি সরল করা যেতে পারেdf %<>% select(-col.to.drop.1, -col.to.drop.2, ..., -col.to.drop.6)
মারেক

1
আপনার যদি কলামগুলির দীর্ঘ তালিকা ছেড়ে dplyrযেতে থাকে তবে এগুলি ভাগ করে নেওয়া এবং কেবল একটি বিয়োগ করা সহজতর হতে পারে:df.cut <- df %>% select(-c(col.to.drop.1, col.to.drop.2, ..., col.to.drop.n))
আইনিয়ার

14

আমি ভাবতে থাকি এখানে আরও ভাল একটি মূর্খতা থাকতে হবে, তবে নাম অনুসারে কলামগুলি বিয়োগ করার জন্য, আমি নিম্নলিখিতগুলি করতে চাই:

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)

# return everything except a and c
df <- df[,-match(c("a","c"),names(df))]
df

4
ম্যাচটিকে অস্বীকার করা ভাল ধারণা নয় -df[,-match(c("e","f"),names(df))]
হ্যাডলি

। @ জেডিলং - আমি কলামটি যেখানে কলামের নাম দিয়ে শুরু করতে চাইছি তা যদি ফেলে দিতে চাই -?
চেতন অরবিন্দ পাতিল

12

dropNamed()বার্নড বিস্কেলের BBmiscপ্যাকেজে ডাকা একটি ফাংশন রয়েছে যা ঠিক এটি করে।

BBmisc::dropNamed(df, "x")

সুবিধাটি হ'ল এটি ডেটা ফ্রেমের যুক্তিটি পুনরাবৃত্তি করা এড়িয়ে যায় এবং এভাবে পাইপিংয়ের জন্য উপযুক্ত magrittr(ঠিক যেমন dplyrপদ্ধতির মতো ):

df %>% BBmisc::dropNamed("x")

9

আপনি যদি @ হ্যাডলির উপরেরটি ব্যবহার করতে না চান তবে অন্য একটি সমাধান: "COLUMN_NAME" যদি আপনি যে কলামটি নামাতে চান তার নাম:

df[,-which(names(df) == "COLUMN_NAME")]

1
(1) সমস্যাটি হ'ল একসাথে একাধিক কলাম ড্রপ করা। (২) না থাকলে COLUMN_NAMEএটি কাজ করবে না df(নিজেকে পরীক্ষা করুন df<-data.frame(a=1,b=2):)। (3) df[,names(df) != "COLUMN_NAME"]সহজ এবং (2)
মারেক

আপনি এই উত্তর সম্পর্কে আরও কিছু তথ্য দিতে পারেন?
আকাশ নায়ক

8

select(-one_of(drop_col_names))পূর্ববর্তী উত্তরে দেখানো ছাড়াও dplyrকলাম বাদ দেওয়ার জন্য আরও কয়েকটি বিকল্প রয়েছে যা ব্যবহার select()করে নির্দিষ্ট কলামের নাম সংজ্ঞায়িত করা হয় না (কলামের নামগুলির জন্য বিভিন্ন ধরণের জন্য ডিপি্লায়ার স্টারওয়ার নমুনা ডেটা ব্যবহার করে):

library(dplyr)
starwars %>% 
  select(-(name:mass)) %>%        # the range of columns from 'name' to 'mass'
  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('^f.+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 

আপনার যদি এমন কোনও কলাম ড্রপ করতে হয় যা ডেটা ফ্রেমে উপস্থিত থাকতে পারে বা নাও থাকতে পারে তবে কলামের নামটি উপস্থিত না থাকলে এটি select_if()ব্যবহারের বিপরীতে one_of()কোনও Unknown columns:সতর্কতা নিক্ষেপ করবে না here এই উদাহরণে 'ব্যাড_ কলাম' ডেটা ফ্রেমে কোনও কলাম নয়:

starwars %>% 
  select_if(!names(.) %in% c('height', 'mass', 'bad_column'))

4

অপসারণের জন্য ডেটা ফ্রেম এবং কমা দ্বারা পৃথক করা নামগুলির একটি স্ট্রিং সরবরাহ করুন :

remove_features <- function(df, features) {
  rem_vec <- unlist(strsplit(features, ', '))
  res <- df[,!(names(df) %in% rem_vec)]
  return(res)
}

ব্যবহার :

remove_features(iris, "Sepal.Length, Petal.Width")

এখানে চিত্র বর্ণনা লিখুন


1

আপনি যে কলামগুলির সাহায্যে ড্রপ করতে চান তার সূচি সন্ধান করুন which। এই সূচকে একটি নেতিবাচক চিহ্ন দিন ( *-1)। তারপরে সেই মানগুলিতে সাবসেট করুন যা এগুলি ডেটাফ্রেম থেকে সরিয়ে দেবে। এটি একটি উদাহরণ।

DF <- data.frame(one=c('a','b'), two=c('c', 'd'), three=c('e', 'f'), four=c('g', 'h'))
DF
#  one two three four
#1   a   d     f    i
#2   b   e     g    j

DF[which(names(DF) %in% c('two','three')) *-1]
#  one four
#1   a    g
#2   b    h

1

আপনার যদি বড় থাকে data.frameএবং মেমোরির ব্যবহার কম হয় [ অথবা rmএবংwithin করতে একটি কলাম অপসারণdata.frame , যেমন subsetবর্তমানে (রাঃ 3.6.2) আরো মেমরি ব্যবহার করছে - পাশে সহায়িকার ইঙ্গিতটি করতে ব্যবহার subsetইন্টারেক্টিভ

getData <- function() {
  n <- 1e7
  set.seed(7)
  data.frame(a = runif(n), b = runif(n), c = runif(n), d = runif(n))
}

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF <- DF[setdiff(names(DF), c("a", "c"))] ##
#DF <- DF[!(names(DF) %in% c("a", "c"))] #Alternative
#DF <- DF[-match(c("a","c"),names(DF))]  #Alternative
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#0.1 MB are used

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF <- subset(DF, select = -c(a, c)) ##
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#357 MB are used

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF <- within(DF, rm(a, c)) ##
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#0.1 MB are used

DF <- getData()
tt <- sum(.Internal(gc(FALSE, TRUE, TRUE))[13:14])
DF[c("a", "c")]  <- NULL ##
sum(.Internal(gc(FALSE, FALSE, TRUE))[13:14]) - tt
#0.1 MB are used
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.