मान लीजिए, आपके पास एक data.frame है जैसे:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
आप केवल उन्हीं स्तंभों का चयन कैसे करेंगे जो x में संख्यात्मक हैं?
मान लीजिए, आपके पास एक data.frame है जैसे:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
आप केवल उन्हीं स्तंभों का चयन कैसे करेंगे जो x में संख्यात्मक हैं?
जवाबों:
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)
undefined columns selected
। आप इससे कैसे बचें?
tryCatch()
निपटने के लिए आप एक का उपयोग कर सकते हैं । कृपया एक नया प्रश्न खोलने पर विचार करें।
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 माइक्रोसेकंड है ।
Filter()
काम नहीं है की जगह ले रहा है, जैसे Filter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
काम नहीं करेगा।
यदि आप केवल स्तंभ नामों में रुचि रखते हैं तो इसका उपयोग करें:
names(dplyr::select_if(train,is.numeric))
यह अन्य उत्तरों के लिए एक वैकल्पिक कोड है:
x[, sapply(x, class) == "numeric"]
के साथ data.table
x[, lapply(x, is.numeric) == TRUE, with = FALSE]
लाइब्रेरी 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)
एक और तरीका इस प्रकार हो सकता है: -
#extracting numeric columns from iris datset
(iris[sapply(iris, is.numeric)])
यदि आपके पास कई कारक चर हैं, तो आप उपयोग कर सकते हैं select_if
funtion का । dplyr संकुल को स्थापित करें। कई फ़ंक्शन हैं जो किसी स्थिति को संतुष्ट करके डेटा को अलग करते हैं। आप शर्तें सेट कर सकते हैं।
इस तरह का उपयोग करें।
categorical<-select_if(df,is.factor)
str(categorical)
यह सीधे सवाल का जवाब नहीं देता है, लेकिन बहुत उपयोगी हो सकता है, खासकर यदि आप अपने आईडी कॉलम और आश्रित चर को छोड़कर सभी संख्यात्मक कॉलम जैसा कुछ चाहते हैं।
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))
x[nums]
याx[sapply(x,is.numeric)]
काम करता है। और वे हमेशा लौटते हैंdata.frame
।x[1]
बनाम की तुलना करेंx[,1]
- पहला हैdata.frame
, दूसरा एक वेक्टर है। यदि कोई रूपांतरण रोकना चाहता है तो उसका उपयोग करना चाहिएx[, 1, drop=FALSE]
।