উত্তর:
যেহেতু (এখনও) কেউ চেক-চিহ্ন পেয়েছে না, তাই ধরে নিই যে আপনার মনে কিছু ব্যবহারিক সমস্যা রয়েছে, বেশিরভাগ কারণেই আপনি কোন ধরণের ভেক্টর রূপান্তর করতে চান তা নির্দিষ্ট করেননি 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
, আপনি ভাগ্যবান হবেন, এবং কোনও এনএ না দিয়ে পালিয়ে যাবেন:
> 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()
আবদ্ধ করেন, যেমন @ মেহেরাদ মাহমুদিয়ান নীচে প্রস্তাব করেছেন, এটি কার্যকর হবে।
যদি 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))
এবং এটি কাজ করেছে। এখন আমি নিশ্চিত নই যে আমার কলামটি কেবলমাত্র পূর্ণসংখ্যা কিনা!
যদিও আপনার প্রশ্নটি কঠোরভাবে সংখ্যাসূচকভাবে রয়েছে, এমন অনেক রূপান্তর রয়েছে যা আর শুরু করার সময় বোঝা মুশকিল I'll এই প্রশ্নের অনুরূপ এই প্রশ্নের ।
প্রকার রূপান্তরটি আরে ব্যথা হতে পারে কারণ (১) কারণগুলি সরাসরি সংখ্যায় রূপান্তরিত হতে পারে না, তাদের প্রথমে অক্ষর শ্রেণিতে রূপান্তর করা দরকার, (২) তারিখগুলি একটি বিশেষ ক্ষেত্রে যা আপনার সাধারণত আলাদাভাবে মোকাবেলা করতে হবে, এবং (3) ডেটা ফ্রেম কলামগুলি জুড়ে লুপিং করা জটিল can ভাগ্যক্রমে, "tidyvers" বেশিরভাগ সমস্যার সমাধান করেছে।
এই সমাধানটি mutate_each()
ডেটা ফ্রেমের সমস্ত কলামে একটি ফাংশন প্রয়োগ করতে ব্যবহার করে। এই ক্ষেত্রে, আমরা type.convert()
ফাংশনটি প্রয়োগ করতে চাই , যা স্ট্রিংগুলিকে এটির সংখ্যায় রূপান্তরিত করে can কারণ আর উপাদানগুলিকে পছন্দ করে (কেন তা নিশ্চিত নয়) এমন অক্ষর কলামগুলিতে যে চরিত্রটি থাকা উচিত সেগুলি ফ্যাক্টারে পরিবর্তিত হয়। এটি ঠিক করার জন্য, 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)
আমি সাধারণত শেষটি ব্যবহার করি যদি আমি একই সাথে ম্যাট্রিক্স এবং সংখ্যায় রূপান্তর করতে চাই
সর্বজনীন উপায় ব্যবহার করে 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)))
যদিও অন্যেরা বিষয়টিকে খুব ভালভাবে কভার করেছেন, আমি এই অতিরিক্ত দ্রুত চিন্তা / ইঙ্গিতটি যুক্ত করতে চাই। আপনি অক্ষরগুলি কেবলমাত্র সংখ্যায় অন্তর্ভুক্ত রয়েছে কিনা তা আগে থেকেই পরীক্ষা করতে আপনি রেজিএক্সপ ব্যবহার করতে পারেন।
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/
চর কলামগুলি বিদ্যমান থাকতে পারে তা বিবেচনা করে এটি কলামের ধরণের এক্সেল শিটের স্বয়ংক্রিয়ভাবে উত্তর পান ইন অ্যাবডাউয়ের উপর ভিত্তি করে :
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])
}
}
with hablar :: রূপান্তর
একাধিক কলাম সহজেই বিভিন্ন ডেটা ধরণের রূপান্তর করতে আপনি ব্যবহার করতে পারেন hablar::convert
। সাধারণ বাক্য গঠন: df %>% convert(num(a))
কলামটি ডিএফ থেকে সংখ্যায় রূপান্তর করে।
বিস্তারিত উদাহরণ
সমস্ত কলামকে 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[] <- lapply(df, as.character)
df <- data.frame(lapply(df, function(x) ifelse(!is.na(as.numeric(x)), as.numeric(x), x)))
আমি শেন এবং জোড়ানের সমাধান বিটিডব্লিউ উল্লেখ করেছি