ডেটা ফ্রেম থেকে কেবল সংখ্যার কলামগুলি নির্বাচন করা হচ্ছে


189

মনে করুন, আপনার কাছে একটি ডেটা ফ্রেম রয়েছে:

x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])

আপনি কীভাবে কেবলমাত্র সেই কলামগুলিকেই বেছে নেবেন যেগুলি সংখ্যাযুক্ত?

উত্তর:


288

সম্পাদনা: অসদাচরণের ব্যবহার এড়াতে আপডেট করা হয়েছে sapply

যেহেতু একটি ডেটা ফ্রেম একটি তালিকা তাই আমরা তালিকা-প্রয়োগকারী ফাংশনগুলি ব্যবহার করতে পারি:

nums <- unlist(lapply(x, is.numeric))  

তারপরে স্ট্যান্ডার্ড সাবসেটিং

x[ , nums]

## don't use sapply, even though it's less code
## nums <- sapply(x, is.numeric)

আরও একটি মুশকিল আধুনিক আর এর জন্য আমি এখন সুপারিশ করব

x[ , purrr::map_lgl(x, is.numeric)]

কম কোডি, আর এর নির্দিষ্ট কিরকগুলিকে কম প্রতিফলিত করে এবং আরও সোজা, এবং ডেটাবেস-ব্যাক-এন্ড টিবিলগুলিতে ব্যবহার করার জন্য শক্তিশালী:

dplyr::select_if(x, is.numeric)

10
x[nums]বা x[sapply(x,is.numeric)]পাশাপাশি কাজ করে। এবং তারা সবসময় ফিরে আসে data.framex[1]বনাম তুলনা করুন x[,1]- প্রথমটি হ'ল data.frame, দ্বিতীয়টি ভেক্টর। যদি কেউ রূপান্তর প্রতিরোধ করতে চায় তবে অবশ্যই ব্যবহার করতে হবে x[, 1, drop=FALSE]
মেরেক

কেবল ধারাবাহিক ডেটা নির্বাচন করার কোনও উপায়? এই পদ্ধতিটি অবিচ্ছিন্ন পাশাপাশি পূর্ণসংখ্যারও ফিরে আসে।
অ্যারগেট

যখন কোনও সংখ্যাসূচক কলাম না থাকে, নিম্নলিখিত ত্রুটি দেখা দেয় undefined columns selected। কীভাবে এড়ানো যায়?
ইয়োহান ওবাদিয়া

@ সয়েলসকিগুয়ের অবিচ্ছিন্ন ডেটা as.numeric হতে হবে। সম্ভবত আপনার কাছে এমন ফ্যাক্টর ডেটা রয়েছে যা সংখ্যার আকারে রয়েছে? আপনার একটি নতুন প্রশ্ন খোলার উচিত।
ব্র্যান্ডন বার্টেলসেন

1
@ ইয়োহানবাবাদিয়া আপনি এটি tryCatch()মোকাবেলায় একটি ব্যবহার করতে পারেন । একটি নতুন প্রশ্ন খোলার বিবেচনা করুন।
ব্র্যান্ডন বার্টেলসেন

79

Dplyr প্যাকেজ এর select_if(ফাংশন একটি মার্জিত সমাধান:

library("dplyr")
select_if(x, is.numeric)

44

Filter() বেস প্যাকেজ থেকে ব্যবহারের ক্ষেত্রে উপযুক্ত ফাংশন: আপনার কেবল কোড করতে হবে:

Filter(is.numeric, x)

এটি এর চেয়েও দ্রুত select_if():

library(microbenchmark)
microbenchmark(
    dplyr::select_if(mtcars, is.numeric),
    Filter(is.numeric, mtcars)
)

(আমার কম্পিউটারে) এর জন্য 60 মাইক্রোসেকেন্ডের মাঝারি Filterএবং 21,000 মাইক্রোসেকেন্ডের select_if(350x দ্রুত) ফেরত দেয়।


কোনও সংখ্যক কলাম উপস্থিত না থাকলে এই সমাধানটি ব্যর্থ হয় না। এটি ব্যবহারে কোনও ত্রুটি আছে কি?
bli

ফিল্টার কেবল কলামগুলির চেয়ে ডেটাফ্রেমের সারিগুলিতে প্রযোজ্য। এই হিসাবে, এই সমাধানটি সঠিক ফলাফল দেয় না।
মাইকেল

4
@ মিশেল বেস প্যাকেজ থেকে ফিল্টার বিভ্রান্ত করবেন না এবং dplyr প্যাকেজ থেকে ফিল্টার করুন!
কেভিন জারকা 14

1
@ বিলি আমি ফিল্টার ব্যবহারের কোনও অপূর্ণতা দেখতে পাচ্ছি না। এর ইনপুটটি একটি ডেটা.ফ্রেম অবজেক্ট এবং এটি একটি
ডেটা ফ্রেম ফেরায়

রেফারেন্সের জন্য এখানে কেবল চিমিং করা: যা Filter()এখানে কাজ করে না তা প্রতিস্থাপন করা হয়, যেমন Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)কাজ করবে না।
মোবিয়াস জুম

8

যদি আপনি কেবল কলামের নামগুলিতে আগ্রহী হন তবে এটি ব্যবহার করুন:

names(dplyr::select_if(train,is.numeric))

5

অন্যান্য উত্তরের জন্য এটি একটি বিকল্প কোড:

x[, sapply(x, class) == "numeric"]

সঙ্গে একটি data.table

x[, lapply(x, is.numeric) == TRUE, with = FALSE]

3
এটি আউনিক উত্তর না দিয়ে নির্বাচিত উত্তরের একটি মন্তব্য।
ব্র্যান্ডন বার্টেলসেন

2
কলামে একাধিক শ্রেণি থাকতে পারে।
সমৃদ্ধ স্ক্রিভেন


2

গ্রন্থাগার পিসিআমিক্সডাটাতে ফান্টন স্প্লিটমিক্স রয়েছে যা প্রদত্ত ডেটাফ্রেম "আপনার ডেটাফ্রেম" এর গুণগত (সংখ্যাসূচক তথ্য) এবং গুণগত (শ্রেণিবদ্ধ তথ্য) বিভক্ত:

install.packages("PCAmixdata")
library(PCAmixdata)
split <- splitmix(YourDataframe)
X1 <- split$X.quanti(Gives numerical columns in the dataset) 
X2 <- split$X.quali (Gives categorical columns in the dataset)

2

অন্য উপায় নিম্নলিখিত হিসাবে হতে পারে:

#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])

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

1

আপনার যদি অনেকগুলি ফ্যাক্টর ভেরিয়েবল থাকে তবে আপনি ব্যবহার করতে পারেন select_if মজাদার । dplyr প্যাকেজ ইনস্টল করুন। অনেকগুলি ফাংশন রয়েছে যা শর্তকে সন্তুষ্ট করে ডেটা পৃথক করে। আপনি শর্ত সেট করতে পারেন।

এই মত ব্যবহার করুন।

categorical<-select_if(df,is.factor)
str(categorical)

2
এই আগের উত্তরটির সদৃশ মনে হচ্ছে stackoverflow.com/a/40808873/170352
ব্র্যান্ডন বার্টেলসেন

0

এটি সরাসরি প্রশ্নের উত্তর দেয় না তবে এটি খুব কার্যকর হতে পারে, বিশেষত যদি আপনি আপনার আইডি কলাম এবং নির্ভরশীল পরিবর্তনশীল ব্যতীত সমস্ত সংখ্যক কলামের মতো কিছু চান।

numeric_cols <- sapply(dataframe, is.numeric) %>% which %>% 
                   names %>% setdiff(., c("id_variable", "dep_var"))

dataframe %<>% dplyr::mutate_at(numeric_cols, function(x) your_function(x))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.