डेटा फ्रेम से केवल संख्यात्मक कॉलम का चयन करना


189

मान लीजिए, आपके पास एक data.frame है जैसे:

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

आप केवल उन्हीं स्तंभों का चयन कैसे करेंगे जो x में संख्यात्मक हैं?

जवाबों:


289

EDIT: बीमार की सलाह से बचने के लिए अद्यतन किया गया 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]
मर्क

केवल निरंतर डेटा का चयन करने का कोई तरीका? यह विधि निरंतर और पूर्णांक के रूप में भी लौटती है।
Derelict

जब कोई संख्यात्मक स्तंभ नहीं होता है, तो निम्न त्रुटि उत्पन्न होती है undefined columns selected। आप इससे कैसे बचें?
योहन ओबाडिया

@SoilSciGuy निरंतर डेटा as.numeric होना चाहिए। शायद आपके पास कारक डेटा है जो संख्यात्मक रूप में है? आपको एक नया प्रश्न खोलना चाहिए।
ब्रेंडन बर्टेल्सन

1
@YohanObadia इससे 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, और select_if(350x तेज) के लिए 21 000 माइक्रोसेकंड है ।


जब कोई संख्यात्मक कॉलम मौजूद नहीं है, तो यह समाधान विफल नहीं होता है। क्या इसका उपयोग करने में कोई कमियां हैं?
bli

फ़िल्टर केवल स्तंभों के बजाय डेटाफ़्रेम की पंक्तियों पर लागू होता है। जैसे, यह समाधान सही परिणाम नहीं देगा।
माइकल

4
@ मिचेल बेस पैकेज से फ़िल्टर को भ्रमित न करें और dplyr पैकेज से फ़िल्टर करें!
केविन ज़र्का

1
@ मैं फ़िल्टर का उपयोग करने का कोई दोष नहीं देख सकता। अपने इनपुट एक data.frame वस्तु है और यह एक data.frame वापसी
केविन Zarca

बस संदर्भ के लिए यहाँ में चीमिंग: यहाँ के लिए क्या 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

लाइब्रेरी PCAmixdata में फंक्शनलटन स्प्लिटमिक्स है जो किसी दिए गए डेटाफ़्रेम "YourDataframe" के मात्रात्मक (संख्यात्मक डेटा) और गुणात्मक (श्रेणीबद्ध डेटा) को विभाजित करता है जैसा कि नीचे दिखाया गया है:

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 funtion का । 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))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.