जवाबों:
चूंकि (अभी भी) किसी को भी चेक-मार्क नहीं मिला है, मेरा मानना है कि आपके मन में कुछ व्यावहारिक समस्या है, ज्यादातर इसलिए क्योंकि आपने निर्दिष्ट नहीं किया है कि आप किस प्रकार के वेक्टर को बदलना चाहते हैं 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
???
पैट्रिक बर्न्स के संबंध में कृपया! =)
कुछ ऐसा है जिसने मेरी मदद की है: यदि आपके पास परिवर्तित करने के लिए चर की सीमाएँ हैं (या सिर्फ एक और फिर एक), तो आप उपयोग कर सकते हैं 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)
sapply
कॉल as.data.frame()
को दाहिने हाथ की तरफ लपेटते हैं, जैसा कि @Mehrad Mahmoudian नीचे सुझाया गया है, तो यह काम करेगा।
यदि x
डेटाफ़्रेम का कॉलम नाम है dat
, और x
प्रकार का कारक है, तो उपयोग करें:
as.numeric(as.character(dat$x))
as.character
वास्तव में जोड़ना वही है जिसकी मुझे तलाश थी। अन्यथा रूपांतरण कभी-कभी गलत हो जाता है। कम से कम मेरे मामले में।
Error: (list) object cannot be coerced to type 'double'
हालांकि मुझे यह सुनिश्चित था कि मेरे वेक्टर में कोई वर्ण / विराम चिह्न नहीं था। फिर मैंने कोशिश की as.numeric(as.character(dat$x))
और यह काम कर गया। अब मुझे यकीन नहीं है कि मेरा कॉलम वास्तव में केवल पूर्णांक है या नहीं!
जबकि आपका प्रश्न संख्यात्मक रूप से कड़ाई से है, ऐसे कई रूपांतरण हैं जो आर को शुरू करते समय समझना मुश्किल है। मैं मदद करने के तरीकों को संबोधित करना चाहूंगा। इस सवाल के समान है इस सवाल ।
टाइप रूपांतरण आर में दर्द हो सकता है क्योंकि (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()
(यानी, कारक वर्ग के बजाय चरित्र वर्ग में धर्मान्तरित लोगों तार)।
टिम सही है, और शेन में एक चूक है। यहाँ अतिरिक्त उदाहरण हैं:
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())
।
निम्नलिखित कोड के साथ आप सभी डेटा फ़्रेम कॉलम को न्यूमेरिक में बदल सकते हैं (एक्स डेटा फ्रेम है जिसे हम इसे कॉलम में बदलना चाहते हैं):
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)
मैं आमतौर पर उपयोग करें यह पिछले एक है, तो मैं चाहता हूँ मैट्रिक्स और संख्यात्मक कन्वर्ट करने के लिए एक साथ
यदि आप समस्याओं में भाग लेते हैं:
as.numeric(as.character(dat$x))
अपने दशमलव अंकों पर एक नज़र डालें। यदि वे "के बजाय", "हैं।" (उदाहरण के लिए "5,3") ऊपर काम नहीं करेगा।
एक संभावित समाधान है:
as.numeric(gsub(",", ".", dat$x))
मेरा मानना है कि कुछ गैर-अंग्रेजी भाषी देशों में यह काफी सामान्य है।
सार्वभौमिक तरीका 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"
as.is = TRUE
यदि आप अपने चरित्र को या तो संख्यात्मक या कारकों में बदलना चाहते हैं तो हटा दें
matrix
संख्यात्मक परिवर्तन करने के लिए टाइप किया classes=matrix
जाता है पहला तर्क मोड चरित्र का होना चाहिए
डेटा फ्रेम कॉलम को न्यूमेरिक करने के लिए आपको बस करना होगा: -
संख्यात्मक का कारक: -
data_frame$column <- as.numeric(as.character(data_frame$column))
sapply(data_frame,function(x) as.numeric(as.character(x)))
हालाँकि अन्य लोगों ने विषय को अच्छी तरह से कवर किया है, मैं इस अतिरिक्त त्वरित विचार / संकेत को जोड़ना चाहूंगा। आप अग्रिम में जांचने के लिए 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/
यह मानते हुए कि चार कॉलम मौजूद हो सकते हैं, यह स्वचालित रूप से उत्तर देने वाले एक्सेल शीट के स्तंभ प्रकार में @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)
यदि डेटाफ़्रेम में कई प्रकार के कॉलम हैं, तो कुछ वर्ण, कुछ संख्यात्मक केवल उन स्तंभों को परिवर्तित करने का प्रयास करते हैं जिनमें संख्यात्मक मान संख्यात्मक को समाहित करते हैं:
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])
}
}
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
वर्ण को संख्यात्मक में बदलने के लिए आपको इसे लागू करके कारक में बदलना होगा
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))
यह वर्ण को संख्यात्मक रूप से सफलतापूर्वक रूपांतरित कर देगा
df
ist आपकी डेटाफ़्रेम x
एक कॉलम है df
जिसे आप कनवर्ट करना चाहते हैं
as.numeric(factor(df$x))
यदि आप कारकों को संरक्षित करने के बारे में परवाह नहीं करते हैं, और इसे किसी भी स्तंभ पर लागू करना चाहते हैं जो संख्यात्मक में परिवर्तित हो सकता है, तो मैंने नीचे दी गई स्क्रिप्ट का उपयोग किया। अगर df आपकी मूल डेटाफ़्रेम है, तो आप नीचे दी गई स्क्रिप्ट का उपयोग कर सकते हैं।
df[] <- lapply(df, as.character)
df <- data.frame(lapply(df, function(x) ifelse(!is.na(as.numeric(x)), as.numeric(x), x)))