डेटा फ़्रेम कॉलम को संख्यात्मक प्रकार में कैसे परिवर्तित किया जाए?


261

आप डेटा फ़्रेम कॉलम को संख्यात्मक प्रकार में कैसे परिवर्तित करते हैं?

जवाबों:


267

चूंकि (अभी भी) किसी को भी चेक-मार्क नहीं मिला है, मेरा मानना ​​है कि आपके मन में कुछ व्यावहारिक समस्या है, ज्यादातर इसलिए क्योंकि आपने निर्दिष्ट नहीं किया है कि आप किस प्रकार के वेक्टर को बदलना चाहते हैं numeric। मेरा सुझाव है कि आपको transformअपना कार्य पूरा करने के लिए फ़ंक्शन लागू करना चाहिए ।

अब मैं कुछ "रूपांतरण विसंगति" प्रदर्शित करने वाला हूँ:

# create dummy data.frame
d <- data.frame(char = letters[1:5], 
                fake_char = as.character(1:5), 
                fac = factor(1:5), 
                char_fac = factor(letters[1:5]), 
                num = 1:5, stringsAsFactors = FALSE)

आइए हम एक नज़र डालते हैं data.frame

> d
  char fake_char fac char_fac num
1    a         1   1        a   1
2    b         2   2        b   2
3    c         3   3        c   3
4    d         4   4        d   4
5    e         5   5        e   5

और हमें चलाने दें:

> sapply(d, mode)
       char   fake_char         fac    char_fac         num 
"character" "character"   "numeric"   "numeric"   "numeric" 
> sapply(d, class)
       char   fake_char         fac    char_fac         num 
"character" "character"    "factor"    "factor"   "integer" 

अब आप शायद खुद से पूछें "विसंगति कहां है?" खैर, मैं आर में काफी अजीब चीजों में टकरा गया हूं, और यह नहीं है सबसे सत्यानाशी बात है, लेकिन यह आप भ्रमित कर सकते हैं, खासकर यदि आप बिस्तर में रोलिंग से पहले यह पढ़ें।

यहाँ जाता है: पहले दो स्तंभ हैं character। मैंने जानबूझ कर 2 एन डी एक कहा है fake_char। इस characterचर की समानता को अपने उत्तर में बनाए गए डिर्क के साथ रखें। यह वास्तव में एक numericalवेक्टर में परिवर्तित है character। 3 आरडी और 4 वें कॉलम हैं factor, और अंतिम एक "शुद्ध रूप से" है numeric

आप का उपयोग तो transformसमारोह, आप परिवर्तित कर सकते हैं fake_charमें numeric, लेकिन नहीं charचर ही।

> transform(d, char = as.numeric(char))
  char fake_char fac char_fac num
1   NA         1   1        a   1
2   NA         2   2        b   2
3   NA         3   3        c   3
4   NA         4   4        d   4
5   NA         5   5        e   5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion

लेकिन अगर आप एक ही काम करते हैं fake_charऔर char_facआप भाग्यशाली होंगे, और कोई NA नहीं है:

> transform(d, fake_char = as.numeric(fake_char), 
               char_fac = as.numeric(char_fac))

  char fake_char fac char_fac num
1    a         1   1        1   1
2    b         2   2        2   2
3    c         3   3        3   3
4    d         4   4        4   4
5    e         5   5        5   5

आप बदल सहेजते हैं data.frameऔर के लिए जाँच modeऔर class, आप प्राप्त करेंगे:

> D <- transform(d, fake_char = as.numeric(fake_char), 
                    char_fac = as.numeric(char_fac))

> sapply(D, mode)
       char   fake_char         fac    char_fac         num 
"character"   "numeric"   "numeric"   "numeric"   "numeric" 
> sapply(D, class)
       char   fake_char         fac    char_fac         num 
"character"   "numeric"    "factor"   "numeric"   "integer"

तो, निष्कर्ष यह है: हाँ, आप characterवेक्टर को एक में बदल सकते हैं numeric, लेकिन केवल अगर यह तत्व "परिवर्तनीय" हैं numericयदि characterवेक्टर में केवल एक तत्व है, तो आपको उस वेक्टर को numericalएक में बदलने की कोशिश करते समय त्रुटि मिलेगी ।

और सिर्फ अपनी बात साबित करने के लिए:

> err <- c(1, "b", 3, 4, "e")
> mode(err)
[1] "character"
> class(err)
[1] "character"
> char <- as.numeric(err)
Warning message:
NAs introduced by coercion 
> char
[1]  1 NA  3  4 NA

और अब, केवल मनोरंजन (या अभ्यास) के लिए, इन कमांड के आउटपुट का अनुमान लगाने की कोशिश करें:

> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???

पैट्रिक बर्न्स के संबंध में कृपया! =)


6
डेटा फ़ाइलों में पढ़ते समय 'stringsAsFactors = FALSE' महत्वपूर्ण है।
रॉबर्ट ब्रिसिटा

4
मुझे पता है कि यह पुराना है ... लेकिन ... आपने df $ fake_char <- as.integer (df $ fake_char) से अधिक ट्रांसफ़ॉर्म () क्यों चुना? आर में एक ही ऑपरेशन करने के कई तरीके हैं और मैं इसे करने के "सही" तरीके को समझने में अटक जाता हूं। धन्यवाद।
रिप्लेन

तो एक संख्यात्मक वेक्टर में <- c (1, "b", 3, 4, "e") को गलत तरीके से बदलना असंभव है? एक्सेल में, एक बटन है जो आपको "संख्या में बदलने" की अनुमति देता है। जो कुछ भी मूल्य स्तंभ को एक संख्यात्मक बनाता है। मैं r में नकल करने की कोशिश कर रहा हूं।
फ्लाइटलेस 13wings

चेतावनी! त्रुटि। आपको मिश्रित संख्यात्मक / वर्ण को संख्यात्मक में परिवर्तित करने में त्रुटि नहीं मिलती है, आपको एक चेतावनी और कुछ NA मान मिलते हैं।
ग्रेगर थॉमस

136

कुछ ऐसा है जिसने मेरी मदद की है: यदि आपके पास परिवर्तित करने के लिए चर की सीमाएँ हैं (या सिर्फ एक और फिर एक), तो आप उपयोग कर सकते हैं sapply

थोडा निरर्थक लेकिन सिर्फ उदाहरण के लिए:

data(cars)
cars[, 1:2] <- sapply(cars[, 1:2], as.factor)

कॉलम 3, 6-15 और 37 का कहना है कि आपको डेटाफ्रेम को संख्यात्मक एक में बदलना होगा:

dat[, c(3,6:15,37)] <- sapply(dat[, c(3,6:15,37)], as.numeric)

1
as.factor उपरोक्त कोड में कॉलम पात्र बनाता है
MySchizoBuddy

1
सैप्ली परिवर्तन से बेहतर है, जब चर नामों के बजाय सूचकांकों के वैक्टर को संभालना
smci

@MySchizoBuddy सही है, कम से कम मेरे डेटा के साथ। मूल df कारकों के रूप में "परिवर्तित" कॉलम पर नहीं ले जाएगा; वे चरित्र बने रहेंगे। यदि आप sapplyकॉल as.data.frame()को दाहिने हाथ की तरफ लपेटते हैं, जैसा कि @Mehrad Mahmoudian नीचे सुझाया गया है, तो यह काम करेगा।
9

क्या यह मैट्रिक्स के लिए काम करेगा? मैं इसे ठीक उसी कोड के साथ
आज़मा

87

यदि xडेटाफ़्रेम का कॉलम नाम है dat, और xप्रकार का कारक है, तो उपयोग करें:

as.numeric(as.character(dat$x))

3
as.characterवास्तव में जोड़ना वही है जिसकी मुझे तलाश थी। अन्यथा रूपांतरण कभी-कभी गलत हो जाता है। कम से कम मेरे मामले में।
थिएमे हनिस २ '

1
As.character की आवश्यकता क्यों है? मुझे एक त्रुटि मिल रही थी: Error: (list) object cannot be coerced to type 'double'हालांकि मुझे यह सुनिश्चित था कि मेरे वेक्टर में कोई वर्ण / विराम चिह्न नहीं था। फिर मैंने कोशिश की as.numeric(as.character(dat$x))और यह काम कर गया। अब मुझे यकीन नहीं है कि मेरा कॉलम वास्तव में केवल पूर्णांक है या नहीं!
योनि

2
यदि आप एक कारक के रूप में asnneric करते हैं तो यह स्तरों को संख्यात्मक में बदल देगा वास्तविक मूल्यों को नहीं। इसलिए as.character को पहले चरित्र और फिर as.numeric के कारक में बदलने की जरूरत है
MySchizoBuddy

यह यहां सबसे अच्छा जवाब है
mitoRibo 20

25

मैंने एक टिप्पणी जोड़ी होगी (कम रेटिंग नहीं)

बस user276042 और pangratz पर जोड़ने के लिए

dat$x = as.numeric(as.character(dat$x))

यह मौजूदा कॉलम x के मान को ओवरराइड करेगा


16

जबकि आपका प्रश्न संख्यात्मक रूप से कड़ाई से है, ऐसे कई रूपांतरण हैं जो आर को शुरू करते समय समझना मुश्किल है। मैं मदद करने के तरीकों को संबोधित करना चाहूंगा। इस सवाल के समान है इस सवाल

टाइप रूपांतरण आर में दर्द हो सकता है क्योंकि (1) कारकों को सीधे संख्यात्मक में नहीं बदला जा सकता है, उन्हें पहले चरित्र वर्ग में परिवर्तित करने की आवश्यकता है, (2) दिनांक एक विशेष मामला है जिसे आपको आमतौर पर अलग से निपटने की आवश्यकता होती है, और (3) डेटा फ्रेम कॉलम में लूपिंग मुश्किल हो सकती है। सौभाग्य से, "tidyverse" ने अधिकांश मुद्दों को हल कर दिया है।

यह समाधान mutate_each()डेटा फ़्रेम में सभी स्तंभों पर फ़ंक्शन लागू करने के लिए उपयोग करता है। इस मामले में, हम type.convert()फ़ंक्शन को लागू करना चाहते हैं , जो स्ट्रिंग्स को संख्यात्मक में परिवर्तित करता है जहां यह हो सकता है। क्योंकि R को कारकों से प्यार है (यह सुनिश्चित नहीं है कि) चरित्र स्तंभ जो कि बने रहना चाहिए, कारक में बदल जाते हैं। इसे ठीक करने के लिए, mutate_if()फ़ंक्शन का उपयोग उन स्तंभों का पता लगाने के लिए किया जाता है जो कारक हैं और चरित्र में परिवर्तन करते हैं। अंत में, मैं यह दिखाना चाहता था कि चरित्र वर्ग में समय-समय पर बदलाव के लिए ल्यूब्रिडेट का उपयोग कैसे किया जा सकता है क्योंकि यह अक्सर शुरुआती लोगों के लिए एक स्टिकिंग ब्लॉक भी होता है।


library(tidyverse) 
library(lubridate)

# Recreate data that needs converted to numeric, date-time, etc
data_df
#> # A tibble: 5 × 9
#>             TIMESTAMP SYMBOL    EX  PRICE  SIZE  COND   BID BIDSIZ   OFR
#>                 <chr>  <chr> <chr>  <chr> <chr> <chr> <chr>  <chr> <chr>
#> 1 2012-05-04 09:30:00    BAC     T 7.8900 38538     F  7.89    523  7.90
#> 2 2012-05-04 09:30:01    BAC     Z 7.8850   288     @  7.88  61033  7.90
#> 3 2012-05-04 09:30:03    BAC     X 7.8900  1000     @  7.88   1974  7.89
#> 4 2012-05-04 09:30:07    BAC     T 7.8900 19052     F  7.88   1058  7.89
#> 5 2012-05-04 09:30:08    BAC     Y 7.8900 85053     F  7.88 108101  7.90

# Converting columns to numeric using "tidyverse"
data_df %>%
    mutate_all(type.convert) %>%
    mutate_if(is.factor, as.character) %>%
    mutate(TIMESTAMP = as_datetime(TIMESTAMP, tz = Sys.timezone()))
#> # A tibble: 5 × 9
#>             TIMESTAMP SYMBOL    EX PRICE  SIZE  COND   BID BIDSIZ   OFR
#>                <dttm>  <chr> <chr> <dbl> <int> <chr> <dbl>  <int> <dbl>
#> 1 2012-05-04 09:30:00    BAC     T 7.890 38538     F  7.89    523  7.90
#> 2 2012-05-04 09:30:01    BAC     Z 7.885   288     @  7.88  61033  7.90
#> 3 2012-05-04 09:30:03    BAC     X 7.890  1000     @  7.88   1974  7.89
#> 4 2012-05-04 09:30:07    BAC     T 7.890 19052     F  7.88   1058  7.89
#> 5 2012-05-04 09:30:08    BAC     Y 7.890 85053     F  7.88 108101  7.90

ध्यान दें कि यदि आप mutate_all(type.convert, as.is=TRUE)इसके बजाय का उपयोग करते हैं mutate_all(type.convert), तो आप mutate_if(is.factor, as.character)कमांड को छोटा करने के लिए निकाल सकते हैं / बचा सकते हैं । as.isइसमें एक तर्क है type.convert()कि यह संकेत देता है कि क्या इसे पात्रों के रूप में या कारकों के रूप में बदलना चाहिए। डिफ़ॉल्ट रूप से, as.is=FALSEमें type.convert()(यानी, कारक वर्ग के बजाय चरित्र वर्ग में धर्मान्तरित लोगों तार)।
LC-डेटाविज्ञानी

15

टिम सही है, और शेन में एक चूक है। यहाँ अतिरिक्त उदाहरण हैं:

R> df <- data.frame(a = as.character(10:15))
R> df <- data.frame(df, num = as.numeric(df$a), 
                        numchr = as.numeric(as.character(df$a)))
R> df
   a num numchr
1 10   1     10
2 11   2     11
3 12   3     12
4 13   4     13
5 14   5     14
6 15   6     15
R> summary(df)
  a          num           numchr    
 10:1   Min.   :1.00   Min.   :10.0  
 11:1   1st Qu.:2.25   1st Qu.:11.2  
 12:1   Median :3.50   Median :12.5  
 13:1   Mean   :3.50   Mean   :12.5  
 14:1   3rd Qu.:4.75   3rd Qu.:13.8  
 15:1   Max.   :6.00   Max.   :15.0  
R> 

हमारे data.frameअब कारक का एक सारांश है (गणना) और संख्यात्मक सारांश as.numeric()--- जो गलत है क्योंकि इसे संख्यात्मक कारक स्तर मिला है --- और (सही) का सारांश as.numeric(as.character())


1
मेरा सौभाग्य। यह भाषा के अधिक मूर्खतापूर्ण कोनों में से एक है, और मुझे लगता है कि यह यहाँ पुराने 'आर गोत्च्स' प्रश्न में चित्रित किया गया है।
डिर्क एडल्डबुलेटेल

14

निम्नलिखित कोड के साथ आप सभी डेटा फ़्रेम कॉलम को न्यूमेरिक में बदल सकते हैं (एक्स डेटा फ्रेम है जिसे हम इसे कॉलम में बदलना चाहते हैं):

as.data.frame(lapply(X, as.numeric))

और पूरे मैट्रिक्स को संख्यात्मक में बदलने के लिए आपके पास दो तरीके हैं: या तो:

mode(X) <- "numeric"

या:

X <- apply(X, 2, as.numeric)

वैकल्पिक रूप से आप data.matrixफंक्शन का उपयोग करके सभी चीजों को न्यूमेरिक में बदल सकते हैं , हालांकि इस बात से अवगत रहें कि कारक सही तरीके से परिवर्तित नहीं हो सकते हैं, इसलिए सब कुछ characterपहले में बदलना सुरक्षित है :

X <- sapply(X, as.character)
X <- data.matrix(X)

मैं आमतौर पर उपयोग करें यह पिछले एक है, तो मैं चाहता हूँ मैट्रिक्स और संख्यात्मक कन्वर्ट करने के लिए एक साथ


12

यदि आप समस्याओं में भाग लेते हैं:

as.numeric(as.character(dat$x))

अपने दशमलव अंकों पर एक नज़र डालें। यदि वे "के बजाय", "हैं।" (उदाहरण के लिए "5,3") ऊपर काम नहीं करेगा।

एक संभावित समाधान है:

as.numeric(gsub(",", ".", dat$x))

मेरा मानना ​​है कि कुछ गैर-अंग्रेजी भाषी देशों में यह काफी सामान्य है।


8

सार्वभौमिक तरीका type.convert()और उपयोग rapply():

convert_types <- function(x) {
    stopifnot(is.list(x))
    x[] <- rapply(x, utils::type.convert, classes = "character",
                  how = "replace", as.is = TRUE)
    return(x)
}
d <- data.frame(char = letters[1:5], 
                fake_char = as.character(1:5), 
                fac = factor(1:5), 
                char_fac = factor(letters[1:5]), 
                num = 1:5, stringsAsFactors = FALSE)
sapply(d, class)
#>        char   fake_char         fac    char_fac         num 
#> "character" "character"    "factor"    "factor"   "integer"
sapply(convert_types(d), class)
#>        char   fake_char         fac    char_fac         num 
#> "character"   "integer"    "factor"    "factor"   "integer"

3
यह सबसे लचीला समाधान है - कुछ अपवित्रों का हकदार है!
रिचर्ड बॉर्डर

एक शीर्ष उत्तर होना चाहिए। as.is = TRUEयदि आप अपने चरित्र को या तो संख्यात्मक या कारकों में बदलना चाहते हैं तो हटा दें
qfazille

एक data.frame में स्तंभों के गुच्छा को बदलने की कोशिश करना जिसमें matrixसंख्यात्मक परिवर्तन करने के लिए टाइप किया classes=matrixजाता है पहला तर्क मोड चरित्र का होना चाहिए
ऐड-सेमी-कॉलन

1
यह विषय में सबसे अच्छा जवाब है।
युक

3

डेटा फ्रेम कॉलम को न्यूमेरिक करने के लिए आपको बस करना होगा: -

संख्यात्मक का कारक: -

data_frame$column <- as.numeric(as.character(data_frame$column))

फिर, यह उत्तर वर्तमान सेट के लिए कुछ भी नहीं जोड़ता है। इसके अलावा, यह एक कारक को संख्यात्मक में बदलने का पसंदीदा तरीका नहीं है। पसंदीदा तरीके के लिए stackoverflow.com/q/3418128 देखें ।
बेनरनेस

एक बेहतर जवाब था:sapply(data_frame,function(x) as.numeric(as.character(x)))
डेटा-

2

हालाँकि अन्य लोगों ने विषय को अच्छी तरह से कवर किया है, मैं इस अतिरिक्त त्वरित विचार / संकेत को जोड़ना चाहूंगा। आप अग्रिम में जांचने के लिए regexp का उपयोग कर सकते हैं कि क्या वर्णों में संभवतः केवल संख्या विज्ञान शामिल हैं।

for(i in seq_along(names(df)){
     potential_numcol[i] <- all(!grepl("[a-zA-Z]",d[,i]))
}
# and now just convert only the numeric ones
d <- sapply(d[,potential_numcol],as.numeric)

अधिक परिष्कृत नियमित अभिव्यक्तियों के लिए और एक साफ-सुथरा क्यों उनकी शक्ति को जानने / अनुभव करने के लिए यह वास्तव में अच्छी वेबसाइट देखें: http://regexr.com/


1

यह मानते हुए कि चार कॉलम मौजूद हो सकते हैं, यह स्वचालित रूप से उत्तर देने वाले एक्सेल शीट के स्तंभ प्रकार में @Addou पर आधारित है :

makenumcols<-function(df){
  df<-as.data.frame(df)
  df[] <- lapply(df, as.character)
  cond <- apply(df, 2, function(x) {
    x <- x[!is.na(x)]
    all(suppressWarnings(!is.na(as.numeric(x))))
  })
  numeric_cols <- names(df)[cond]
  df[,numeric_cols] <- sapply(df[,numeric_cols], as.numeric)
  return(df)
}
df<-makenumcols(df)

0

मेरे पीसी में (आर v.3.2.3), applyया sapplyत्रुटि दें। lapplyअच्छा काम करता है।

dt[,2:4] <- lapply(dt[,2:4], function (x) as.factor(as.numeric(x)))

0

यदि डेटाफ़्रेम में कई प्रकार के कॉलम हैं, तो कुछ वर्ण, कुछ संख्यात्मक केवल उन स्तंभों को परिवर्तित करने का प्रयास करते हैं जिनमें संख्यात्मक मान संख्यात्मक को समाहित करते हैं:

for (i in 1:length(data[1,])){
  if(length(as.numeric(data[,i][!is.na(data[,i])])[!is.na(as.numeric(data[,i][!is.na(data[,i])]))])==0){}
  else {
    data[,i]<-as.numeric(data[,i])
  }
}

0

hablar के साथ :: कन्वर्ट

कई कॉलमों को आसानी से विभिन्न डेटा प्रकारों में परिवर्तित करने के लिए जिनका आप उपयोग कर सकते हैं hablar::convert। सिंपल सिंटैक्स: df %>% convert(num(a))कॉलम को df से न्यूमेरिक में कनवर्ट करता है।

विस्तृत उदाहरण

mtcarsचरित्र के सभी स्तंभों को परिवर्तित करने देता है ।

df <- mtcars %>% mutate_all(as.character) %>% as_tibble()

> df
# A tibble: 32 x 11
   mpg   cyl   disp  hp    drat  wt    qsec  vs    am    gear  carb 
   <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
 1 21    6     160   110   3.9   2.62  16.46 0     1     4     4    
 2 21    6     160   110   3.9   2.875 17.02 0     1     4     4    
 3 22.8  4     108   93    3.85  2.32  18.61 1     1     4     1    

के साथ hablar::convert:

library(hablar)

# Convert columns to integer, numeric and factor
df %>% 
  convert(int(cyl, vs),
          num(disp:wt),
          fct(gear))

का परिणाम:

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

0

वर्ण को संख्यात्मक में बदलने के लिए आपको इसे लागू करके कारक में बदलना होगा

BankFinal1 <- transform(BankLoan,   LoanApproval=as.factor(LoanApproval))
BankFinal1 <- transform(BankFinal1, LoanApp=as.factor(LoanApproval))

आपको एक ही डेटा के साथ दो कॉलम बनाने होंगे, क्योंकि एक कॉलम संख्यात्मक में नहीं बदल सकता है। यदि आप एक रूपांतरण करते हैं तो यह नीचे दी गई त्रुटि देता है

transform(BankData, LoanApp=as.numeric(LoanApproval))
Warning message:
  In eval(substitute(list(...)), `_data`, parent.frame()) :
  NAs introduced by coercion

इसलिए, एक ही डेटा के दो कॉलम लागू करने के बाद

BankFinal1 <- transform(BankFinal1, LoanApp      = as.numeric(LoanApp), 
                                    LoanApproval = as.numeric(LoanApproval))

यह वर्ण को संख्यात्मक रूप से सफलतापूर्वक रूपांतरित कर देगा



0

यदि आप कारकों को संरक्षित करने के बारे में परवाह नहीं करते हैं, और इसे किसी भी स्तंभ पर लागू करना चाहते हैं जो संख्यात्मक में परिवर्तित हो सकता है, तो मैंने नीचे दी गई स्क्रिप्ट का उपयोग किया। अगर df आपकी मूल डेटाफ़्रेम है, तो आप नीचे दी गई स्क्रिप्ट का उपयोग कर सकते हैं।

df[] <- lapply(df, as.character)
df <- data.frame(lapply(df, function(x) ifelse(!is.na(as.numeric(x)), as.numeric(x),  x)))

मैंने शेन और जोरान के समाधान btw को संदर्भित किया

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