डेटा फ्रेम के कॉलम के डेटा प्रकारों का निर्धारण करें


153

मैं R का उपयोग कर रहा हूं और डेटा का उपयोग करके डेटाफ्रेम में लोड कर रहा हूं read.csv()। मैं डेटा फ़्रेम में प्रत्येक कॉलम का डेटा प्रकार कैसे निर्धारित करूं?


प्रोग्रामेटिकली (उदा। sapply(..., class))या अंतःक्रियात्मक (जैसे str(...)) या दोनों? यह आमतौर पर प्रोग्रामेटिक रूप से करने के लिए अधिक स्केलेबल होता है, फिर आप मनमाने ढंग Filter(...)से पूर्णांकों, वर्णों, कारकों आदि के लिए सूची बना सकते हैं या यदि आप किसी भी नामकरण सम्मेलनों का अनुसरण करते हैं तो grep/greplकॉलम-प्रकारों का उपयोग कर सकते हैं।names(...)
22

@ हस्की: मैंने अपने मूल प्रश्न में 'प्रोग्रामेटिकली' नहीं पूछा। मुझे नहीं पता कि आप मेरे प्रश्न की संपूर्ण प्रकृति को क्यों बदलेंगे।
stackoverflowuser2010

ठीक है, यह वापस लुढ़का हुआ था। इसने पूरी प्रकृति को नहीं बदला, उसने इसे दो दिशाओं में स्पष्ट किया। उपयोग करने वाले इंटरएक्टिव दृष्टिकोण str(...)स्केलेबल नहीं हैं और <100 कॉल पर भाप से बाहर निकलते हैं।
sms

जवाबों:


215

उपयोग करने के लिए आपका सबसे अच्छा दांव है ?str()। कुछ उदाहरणों का पता लगाने के लिए, आइए कुछ डेटा बनाते हैं:

set.seed(3221)  # this makes the example exactly reproducible
my.data <- data.frame(y=rnorm(5), 
                      x1=c(1:5), 
                      x2=c(TRUE, TRUE, FALSE, FALSE, FALSE),
                      X3=letters[1:5])

@Wilmer ई हेनो एच का समाधान बहुत सुव्यवस्थित है:

sapply(my.data, class)
        y        x1        x2        X3 
"numeric" "integer" "logical"  "factor" 

उपयोग करने str()से आपको वह जानकारी मिलती है, जैसे अतिरिक्त माल (जैसे आपके कारकों के स्तर और प्रत्येक चर के पहले कुछ मान):

str(my.data)
'data.frame':  5 obs. of  4 variables:
$ y : num  1.03 1.599 -0.818 0.872 -2.682
$ x1: int  1 2 3 4 5
$ x2: logi  TRUE TRUE FALSE FALSE FALSE
$ X3: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5

@ गेविन सिम्पसन का दृष्टिकोण भी सुव्यवस्थित है, लेकिन इससे कुछ अलग जानकारी प्रदान करता है class():

sapply(my.data, typeof)
       y        x1        x2        X3 
"double" "integer" "logical" "integer"

के बारे में अधिक जानकारी के लिए class, typeofऔर मध्य बच्चे, mode, इस उत्कृष्ट अतः धागा देखें: आर 'मोड' और 'वर्ग' और 'typeof' में चीजों के प्रकार की एक व्यापक सर्वेक्षण अपर्याप्त हैं


1
कई महीनों के लिए आर का उपयोग करने के बाद, मैंने पाया है कि str(dataframe)एक नज़र में कॉलम प्रकार निर्धारित करने का सबसे तेज़ तरीका है। अन्य दृष्टिकोणों को अधिक कीस्ट्रोक्स की आवश्यकता होती है और अधिक जानकारी नहीं दिखाते हैं, लेकिन यदि स्तंभ डेटा प्रकार अन्य फ़ंक्शन के लिए एक इनपुट हैं तो वे सहायक होते हैं।
stackoverflowuser2010 20

नमस्ते, जब मैंने आवेदन के बजाय आवेदन के साथ ऐसा ही किया, तो यह काम नहीं किया
डोम जो

@DomJo, आप क्यों इस्तेमाल करेंगे apply()? वह मैट्रिस के लिए है। डेटा फ्रेम एक विशेष प्रकार की सूची है।
गोबर -


18

मै सुझाव दूंगा

sapply(foo, typeof)

यदि आपको डेटा फ्रेम में वास्तविक प्रकार के वैक्टर की आवश्यकता है। class()कुछ अलग जानवर है।

यदि आपको इस जानकारी को वेक्टर के रूप में प्राप्त करने की आवश्यकता नहीं है (अर्थात आपको बाद में प्रोग्राम के लिए कुछ और करने की आवश्यकता नहीं है), बस उपयोग करें str(foo)

दोनों मामलों fooमें आपके डेटा फ्रेम के नाम के साथ प्रतिस्थापित किया जाएगा।


7

बस निम्नलिखित फ़ंक्शन में अपना डेटा फ़्रेम पास करें:

data_types <- function(frame) {
  res <- lapply(frame, class)
  res_frame <- data.frame(unlist(res))
  barplot(table(res_frame), main="Data Types", col="steelblue", ylab="Number of Features")
}

अपने डेटा फ्रेम में सभी डेटा प्रकारों के एक भूखंड का उत्पादन करने के लिए। के लिए आईरिस डाटासेट हम निम्नलिखित मिलती है:

data_types(iris)

यहाँ छवि विवरण दर्ज करें


5

छोटे डेटा फ्रेम के लिए:

library(tidyverse)

as_tibble(mtcars)

आपको डेटा प्रकारों के साथ df का प्रिंट आउट देता है

# A tibble: 32 x 11
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
 * <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1

बड़े डेटा फ्रेम के लिए:

glimpse(mtcars)

आपको डेटा प्रकारों का एक संरचित दृश्य देता है:

Observations: 32
Variables: 11
$ mpg  <dbl> 21.0, 21.0, 22.8, 21.4, 18.7, 18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17....
$ cyl  <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, ...
$ disp <dbl> 160.0, 160.0, 108.0, 258.0, 360.0, 225.0, 360.0, 146.7, 140.8, 167.6, 167.6...
$ hp   <dbl> 110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123, 180, 180, 180, 205, 215...
$ drat <dbl> 3.90, 3.90, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3.0...
$ wt   <dbl> 2.620, 2.875, 2.320, 3.215, 3.440, 3.460, 3.570, 3.190, 3.150, 3.440, 3.440...
$ qsec <dbl> 16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84, 20.00, 22.90, 18.30, 18.90...
$ vs   <dbl> 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, ...
$ am   <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, ...
$ gear <dbl> 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 3, 3, ...
$ carb <dbl> 4, 4, 1, 1, 2, 1, 4, 2, 2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, ...

स्तंभों के डेटा प्रकार की सूची प्राप्त करने के लिए (जैसा कि ऊपर @Alexandre द्वारा कहा गया है):

map(mtcars, class)

डेटा प्रकारों की एक सूची देता है:

$mpg
[1] "numeric"

$cyl
[1] "numeric"

$disp
[1] "numeric"

$hp
[1] "numeric"

स्तंभ का डेटा प्रकार बदलने के लिए:

library(hablar)

mtcars %>% 
  convert(chr(mpg, am),
          int(carb))

स्तंभों mpgऔर amवर्णों और स्तंभों carbको पूर्णांक में रूपांतरित करता है :

# A tibble: 32 x 11
   mpg     cyl  disp    hp  drat    wt  qsec    vs am     gear  carb
   <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <int>
 1 21        6  160    110  3.9   2.62  16.5     0 1         4     4
 2 21        6  160    110  3.9   2.88  17.0     0 1         4     4
 3 22.8      4  108     93  3.85  2.32  18.6     1 1         4     1
 4 21.4      6  258    110  3.08  3.22  19.4     1 0         3     1

3

चूंकि यह स्पष्ट रूप से नहीं कहा गया था, मैं इसे जोड़ता हूं:

मैं एक तालिका बनाने का एक तरीका ढूंढ रहा था जो सभी डेटा प्रकारों की घटनाओं की संख्या रखती हो ।

मान लें कि हमारे पास data.frameदो संख्यात्मक और एक तार्किक कॉलम है

dta <- data.frame(a = c(1,2,3), 
                  b = c(4,5,6), 
                  c = c(TRUE, FALSE, TRUE))

आप उस के साथ प्रत्येक डेटा प्रकार के स्तंभों की संख्या को संक्षेप में बता सकते हैं

table(unlist(lapply(dta, class)))
# logical numeric 
#       1       2 

यह बेहद आसान है, यदि आपके पास बहुत सारे कॉलम हैं और एक त्वरित अवलोकन प्राप्त करना चाहते हैं।

श्रेय देने के लिए: यह समाधान @Cybernetic के उत्तर से प्रेरित था ।


2

यहां एक फ़ंक्शन है जो हेल्परीफंक्शंस पैकेज का हिस्सा है जो आपके डेटा फ्रेम में विभिन्न डेटा प्रकारों की सूची, साथ ही साथ उस प्रकार से जुड़े विशिष्ट चर नामों की सूची लौटाएगा।

install.package('devtools') # Only needed if you dont have this installed.
library(devtools)
install_github('adam-m-mcelhinney/helpRFunctions')
library(helpRFunctions)
my.data <- data.frame(y=rnorm(5), 
                  x1=c(1:5), 
                  x2=c(TRUE, TRUE, FALSE, FALSE, FALSE),
                  X3=letters[1:5])
t <- list.df.var.types(my.data)
t$factor
t$integer
t$logical
t$numeric

आप तब कुछ ऐसा कर सकते थे var(my.data[t$numeric])

आशा है कि यह उपयोगी है!


1
ध्यान देने योग्य है कि हुड के तहत यह lapply(your_data, class)स्वरूपण के लिए अतिरिक्त प्रसंस्करण के एक बिट के साथ है।
ग्रेगर थॉमस

1

यदि आप csv फ़ाइल को data.frame (और मैट्रिक्स नहीं) के रूप में आयात करते हैं, तो आप उपयोग भी कर सकते हैं summary.default

summary.default(mtcars)

     Length Class  Mode   
mpg  32     -none- numeric
cyl  32     -none- numeric
disp 32     -none- numeric
hp   32     -none- numeric
drat 32     -none- numeric
wt   32     -none- numeric
qsec 32     -none- numeric
vs   32     -none- numeric
am   32     -none- numeric
gear 32     -none- numeric
carb 32     -none- numeric

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