কোনও ক্ষতি ছাড়াই কীভাবে কোনও ফ্যাক্টরকে পূর্ণসংখ্যার \ সংখ্যায় রূপান্তর করবেন?


598

আমি যখন কোনও ফ্যাক্টরকে সংখ্যাসূচক বা পূর্ণসংখ্যায় রূপান্তর করি তখন আমি অন্তর্নিহিত স্তরের কোডগুলি পাই, সংখ্যা হিসাবে মানগুলি না।

f <- factor(sample(runif(5), 20, replace = TRUE))
##  [1] 0.0248644019011408 0.0248644019011408 0.179684827337041 
##  [4] 0.0284090070053935 0.363644931698218  0.363644931698218 
##  [7] 0.179684827337041  0.249704354675487  0.249704354675487 
## [10] 0.0248644019011408 0.249704354675487  0.0284090070053935
## [13] 0.179684827337041  0.0248644019011408 0.179684827337041 
## [16] 0.363644931698218  0.249704354675487  0.363644931698218 
## [19] 0.179684827337041  0.0284090070053935
## 5 Levels: 0.0248644019011408 0.0284090070053935 ... 0.363644931698218

as.numeric(f)
##  [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2

as.integer(f)
##  [1] 1 1 3 2 5 5 3 4 4 1 4 2 3 1 3 5 4 5 3 2

pasteআসল মানগুলি পেতে আমাকে অবলম্বন করতে হবে:

as.numeric(paste(f))
##  [1] 0.02486440 0.02486440 0.17968483 0.02840901 0.36364493 0.36364493
##  [7] 0.17968483 0.24970435 0.24970435 0.02486440 0.24970435 0.02840901
## [13] 0.17968483 0.02486440 0.17968483 0.36364493 0.24970435 0.36364493
## [19] 0.17968483 0.02840901

কোনও ফ্যাক্টরকে সংখ্যায় রূপান্তর করার জন্য আরও ভাল উপায় কি?


6
কোনও ফ্যাক্টরের মাত্রাগুলি যাইহোক ( attributes(f)) অক্ষরের ডেটা টাইপ হিসাবে সঞ্চিত হয় , সুতরাং আমি মনে করি না যে এতে কোনও ভুল আছে as.numeric(paste(f))। সম্ভবত এটি কেন ভাবা ভাল হবে (নির্দিষ্ট প্রসঙ্গে) আপনি কেন প্রথম স্থানে একটি ফ্যাক্টর পাচ্ছেন এবং তা বন্ধ করার চেষ্টা করবেন। উদাহরণস্বরূপ, decযুক্তিটি read.tableসঠিকভাবে সেট করা আছে?
সিজেবি

আপনি যদি ডেটাফ্রেম ব্যবহার করেন তবে আপনি হাবলার থেকে রূপান্তর ব্যবহার করতে পারেন। df %>% convert(num(column))। অথবা আপনার যদি কোনও ফ্যাক্টর ভেক্টর থাকে তবে আপনি ব্যবহার করতে পারেনas_reliable_num(factor_vector)
davsjob

উত্তর:


711

এর সতর্কতা বিভাগটি দেখুন ?factor:

বিশেষত, as.numericকোনও ফ্যাক্টরের সাথে প্রয়োগ করা অর্থহীন এবং জড়িত জোর করে ঘটতে পারে। কোনও ফ্যাক্টরটিকে fআনুমানিক মূল সংখ্যাগুলিতে রূপান্তরিত করার as.numeric(levels(f))[f]জন্য প্রস্তাবিত এবং এর চেয়ে কিছুটা বেশি দক্ষ as.numeric(as.character(f))

আর-এ প্রায়শই জিজ্ঞাসিত প্রশ্নাগুলির অনুরূপ পরামর্শ রয়েছে


এর as.numeric(levels(f))[f]চেয়ে বেশি কার্যকর কেন as.numeric(as.character(f))?

as.numeric(as.character(f))কার্যকরভাবে হয় as.numeric(levels(f)[f]), তাই আপনি length(x)মানগুলির চেয়ে মানগুলিতে সংখ্যায় রূপান্তর সম্পাদন করছেন nlevels(x)। গতির পার্থক্যটি কয়েকটি স্তর সহ দীর্ঘ ভেক্টরগুলির জন্য সর্বাধিক স্পষ্ট হবে। মানগুলি যদি বেশিরভাগ ক্ষেত্রে অনন্য হয় তবে গতিতে খুব বেশি পার্থক্য হবে না। তবে আপনি রূপান্তরটি করেন তবে এই কোডটি আপনার কোডের কোনও বাধা হওয়ার সম্ভাবনা নেই, সুতরাং এটি সম্পর্কে খুব বেশি চিন্তা করবেন না।


কিছু সময়

library(microbenchmark)
microbenchmark(
  as.numeric(levels(f))[f],
  as.numeric(levels(f)[f]),
  as.numeric(as.character(f)),
  paste0(x),
  paste(x),
  times = 1e5
)
## Unit: microseconds
##                         expr   min    lq      mean median     uq      max neval
##     as.numeric(levels(f))[f] 3.982 5.120  6.088624  5.405  5.974 1981.418 1e+05
##     as.numeric(levels(f)[f]) 5.973 7.111  8.352032  7.396  8.250 4256.380 1e+05
##  as.numeric(as.character(f)) 6.827 8.249  9.628264  8.534  9.671 1983.694 1e+05
##                    paste0(x) 7.964 9.387 11.026351  9.956 10.810 2911.257 1e+05
##                     paste(x) 7.965 9.387 11.127308  9.956 11.093 2419.458 1e+05

4
সময়সীমার জন্য এই উত্তরটি দেখুন: স্ট্যাকওভারফ্লো.com
আরি বি ফ্রেডম্যান

3
আপনার সমাধানের জন্য অনেক ধন্যবাদ। আমি জিজ্ঞাসা করতে পারি যে কেন as.numeric (স্তর (চ)) [চ] আরও সুনির্দিষ্ট এবং দ্রুত? ধন্যবাদ।
স্যাম

7
@ সাম as.character (চ) as.character.factor () ফাংশনটি সন্ধানের জন্য একটি "আদিম অনুসন্ধান" প্রয়োজন, যা as.numeric (স্তর (চ)) হিসাবে परिभाषित করা হয়েছে [চ]।
জোনাথন

12
as.numeric (লেভেল (f)) [চ] বা as.numeric (as.character (f)) প্রয়োগ করার সময় আমার একটি সতর্কতা রয়েছে: সতর্কতা বার্তা: জবরদস্তি দ্বারা প্রবর্তিত NAs। আপনি কি জানেন সমস্যাটি কোথায় হতে পারে? ধন্যবাদ !
maycca

@ মাইকা আপনি কি এই সমস্যাটিকে জয় করেছেন?
ব্যবহারকারী08041991

91

রূপান্তরকারী উপাদানগুলির জন্য আর এর বেশ কয়েকটি (অননুমোদিত) সুবিধামত কার্য রয়েছে:

  • as.character.factor
  • as.data.frame.factor
  • as.Date.factor
  • as.list.factor
  • as.vector.factor
  • ...

তবে বিরক্তিকরভাবে, ফ্যাক্টর -> সংখ্যার রূপান্তরকে পরিচালনা করার মতো কিছুই নেই । জোশুয়া উলরিচের উত্তরের একটি সম্প্রসারণ হিসাবে, আমি আপনার নিজের প্রতিমা ফাংশনটির সংজ্ঞা দিয়ে এই বাদটি কাটিয়ে উঠতে পরামর্শ দেব:

as.numeric.factor <- function(x) {as.numeric(levels(x))[x]}

যা আপনি আপনার স্ক্রিপ্টের শুরুতে বা আপনার .Rprofileফাইলে আরও ভাল সঞ্চয় করতে পারেন ।


14
ফ্যাক্টর-টু-ইন্টিজার (বা সংখ্যাসূচক) রূপান্তরটি হ্যান্ডেল করার মতো কিছুই নেই কারণ এটি প্রত্যাশিত যে as.integer(factor)অন্তর্নিহিত পূর্ণসংখ্যা কোডগুলি প্রদান করে (এর উদাহরণ বিভাগে দেখানো হয়েছে ?factor)। আপনার বিশ্বব্যাপী পরিবেশে এই ফাংশনটি সংজ্ঞায়িত করা সম্ভবত ঠিক আছে, তবে আপনি যদি সত্যিই এটি এস 3 পদ্ধতি হিসাবে নিবন্ধন করেন তবে সমস্যা হতে পারে।
জোশুয়া আলরিখ

1
এটি একটি ভাল বিষয় এবং আমি সম্মত: ফ্যাক্টরটির সম্পূর্ণ পুনঃনির্ধারণ-> সংখ্যাসূচক রূপান্তরকরণের ফলে অনেকগুলি বিশৃঙ্খলা দেখা দিতে পারে। আমি বুঝতে পেরেছিলাম যে এটি আসলে আর এর একটি ঘাটতি: বোঝার আগে অনেকগুলি জটিল factor->numericরূপান্তরটি লিখেছিলাম : কিছু সুবিধাজনক ফাংশন পাওয়া উচিত ... এটি কল করা আমার কাছে বোধগম্য, তবে ওয়াইএমএমভি। as.numeric.factor
জেলি

4
যদি আপনি নিজেকে এটি অনেক কিছু করতে দেখেন তবে সর্বত্র একসাথে এড়াতে আপনার প্রবাহের কিছু করা উচিত।
জোশুয়া আলরিখ

2
as.numeric.factor না ফেরায়?
জো।

@ জেও: আপনি যে ক্ষেত্রে v=NA;as.numeric.factor(v)বা এর মতো কিছু ব্যবহার করেছেন সে ক্ষেত্রে v='something';as.numeric.factor(v)এটি হওয়া উচিত, অন্যথায় আপনার কোথাও কোনও অদ্ভুত জিনিস চলছে।
জেলি

33

সবচেয়ে সহজ উপায় হ'লunfactor প্যাকেজ ভারহ্যান্ডল থেকে ফাংশনটি ব্যবহার করা

unfactor(your_factor_variable)

এই উদাহরণটি দ্রুত শুরু হতে পারে:

x <- rep(c("a", "b", "c"), 20)
y <- rep(c(1, 1, 0), 20)

class(x)  # -> "character"
class(y)  # -> "numeric"

x <- factor(x)
y <- factor(y)

class(x)  # -> "factor"
class(y)  # -> "factor"

library(varhandle)
x <- unfactor(x)
y <- unfactor(y)

class(x)  # -> "character"
class(y)  # -> "numeric"

unfactorচরিত্র ডাটা টাইপ ফাংশন ধর্মান্তরিত প্রথম এবং তারপর ধর্মান্তরিত সাংখ্যিক ফিরে। unfactorকনসোলে টাইপ করুন এবং আপনি এটি ফাংশনের মাঝখানে দেখতে পাবেন। অতএব এটি প্রশ্নকারীর ইতিমধ্যে যা ছিল তার চেয়ে ভাল সমাধান আর দেয় না।
সিজেবি

এই বলে যে, কোনও ফ্যাক্টরের স্তরগুলি যাইহোক চরিত্রের ধরণের, তাই এই পদ্ধতির দ্বারা কিছুই হারাতে পারে না।
সিজেবি

unfactorফাংশন বিষয় আছে যা সাংখ্যিক রূপান্তরিত করা যাবে না যত্ন নেয়। উদাহরণগুলি দেখুনhelp("unfactor")
মেহরাদ মাহমুদিয়ান

2
@ সেলারাক আমি উল্লেখ করেছি যে এই ফাংশনটি ভারহানডেল প্যাকেজে পাওয়া যায় , যার অর্থ আপনার প্যাকেজটি লোড করা উচিত ( library("varhandle")) আমার উত্তরটির প্রথম লাইনে আমি যেমন উল্লেখ করেছি !!)
মেহরাদ মাহমুদিয়ান

1
@ গ্রেগর একটি হালকা নির্ভরতা যুক্ত করা সাধারণত ক্ষতি করে না এবং অবশ্যই যদি আপনি সবচেয়ে দক্ষ উপায়ে সন্ধান করেন, আপনার নিজের কোডটি দ্রুত সম্পাদন করতে পারে এমন কোড লিখে। কিন্তু আপনি আপনার মন্তব্যে দেখতে পারেন এই তুচ্ছ নয় যেহেতু আপনার কাছে করা as.numeric()এবং as.character()ভুল অনুক্রমে;) কী আপনার কোড খণ্ড একটি অক্ষর ম্যাট্রিক্স মধ্যে ফ্যাক্টর স্তরের সূচক চালু করা হয়, তাই কি তোমার দিকে থাকবে এবং একটি চরিত্রের ভেক্টর যা এমন কয়েকটি সংখ্যা ধারণ করে যা একবার আপনার ফ্যাক্টরের নির্দিষ্ট স্তরের জন্য নির্ধারিত হয়ে থাকে। এই বিভ্রান্তি রোধ করার জন্য সেই প্যাকেজের কার্যকারিতা রয়েছে
মেহরাদ মাহমুদিয়ান

23

দ্রষ্টব্য: এই নির্দিষ্ট উত্তরটি সংখ্যাসূচক মানের উপাদানগুলিকে সংখ্যায় রূপান্তর করার জন্য নয় , এটি শ্রেণিবদ্ধ উপাদানগুলিকে তাদের সংশ্লিষ্ট স্তরের সংখ্যায় রূপান্তর করার জন্য।


এই পোস্টের প্রতিটি উত্তর আমার জন্য ফলাফল তৈরি করতে ব্যর্থ হয়েছিল, এনএ তৈরি হয়েছিল।

y2<-factor(c("A","B","C","D","A")); 
as.numeric(levels(y2))[y2] 
[1] NA NA NA NA NA Warning message: NAs introduced by coercion

আমার জন্য যা কাজ করেছে তা হ'ল -

as.integer(y2)
# [1] 1 2 3 4 1

আপনি কি নিশ্চিত যে আপনার একটি ফ্যাক্টর ছিল? এই উদাহরণটি দেখুন। y<-factor(c("5","15","20","2")); unclass(y) %>% as.numericএটি 5,15,20,2 নয়, 4,1,3,2 প্রদান করে। এটি ভুল তথ্যের মতো বলে মনে হচ্ছে।
মিস্টার ফ্লিক

ঠিক আছে, আমি আজ যা করার চেষ্টা করেছিলাম তার সাথে এটি একই রকম: - y2 <-ফ্যাক্টর (সি ("এ", "বি", "সি", "ডি", "এ")); as.numeric (মাত্রা (y2)) [y2] [1] NA NA NA NA NA সতর্কতা বার্তা: এনএএস জবরদস্তি দ্বারা প্রবর্তিত হয়েছে যেখানে আনক্লাস (y2)%>% as.numeric আমাকে প্রয়োজনীয় ফলাফল দিয়েছে।
ইন্দি

4
ঠিক আছে, ভাল এটি উপরে যে প্রশ্নটি করা হয়েছিল তা নয়। এই প্রশ্নে ফ্যাক্টরের স্তরগুলি সমস্ত "সংখ্যাসূচক"। আপনার ক্ষেত্রে, as.numeric(y)ঠিক কাজ করা উচিত ছিল, এর দরকার নেই unclass()। কিন্তু আবার, এই প্রশ্নটি সম্পর্কে যা ছিল তা নয়। এই উত্তরটি এখানে উপযুক্ত নয়।
মিঃ ফ্লিক

3
ঠিক আছে, আমি সত্যিই আশা করি যে এটি আমার মতো হুট করে এমন কাউকে সহায়তা করে এবং কেবল শিরোনামটি পড়ে!
ইন্দি

1
আপনার যদি পূর্ণসংখ্যার গুণক হিসাবে প্রতিনিধিত্ব করে এমন অক্ষর থাকে তবে আমি এটিই প্রস্তাব করব। এই একমাত্র আমার জন্য কাজ করেছে।
লক্ষ্যটি

9

এটা সম্ভব শুধুমাত্র যখন ফ্যাক্টর লেবেল মূল মান মেলে ক্ষেত্রে। আমি এটি একটি উদাহরণ দিয়ে ব্যাখ্যা করব।

ধরুন ডেটা ভেক্টর x:

x <- c(20, 10, 30, 20, 10, 40, 10, 40)

এখন আমি চারটি লেবেল যুক্ত একটি উপাদান তৈরি করব:

f <- factor(x, levels = c(10, 20, 30, 40), labels = c("A", "B", "C", "D"))

1) xটাইপ ডাবল fসঙ্গে, টাইপ পূর্ণসংখ্যার সাথে হয়। এটি তথ্যের প্রথম অনিবার্য ক্ষতি। উপাদানগুলি সর্বদা পূর্ণসংখ্যার হিসাবে সংরক্ষণ করা হয়।

> typeof(x)
[1] "double"
> typeof(f)
[1] "integer"

২) কেবল fউপলব্ধ থাকার পরে মূল মানগুলিতে (10, 20, 30, 40) ফিরে যাওয়া সম্ভব নয় । আমরা দেখতে পাচ্ছি যে fকেবলমাত্র পূর্ণসংখ্যা মান 1, 2, 3, 4 এবং দুটি বৈশিষ্ট্য রয়েছে - লেবেলের তালিকা ("এ", "বি", "সি", "ডি") এবং শ্রেণি বৈশিষ্ট্য "ফ্যাক্টর"। বেশি কিছু না.

> str(f)
 Factor w/ 4 levels "A","B","C","D": 2 1 3 2 1 4 1 4
> attributes(f)
$levels
[1] "A" "B" "C" "D"

$class
[1] "factor"

মূল মানগুলিতে ফিরে যেতে আমাদের ফ্যাক্টর তৈরিতে ব্যবহৃত স্তরের মানগুলি জানতে হবে। এই ক্ষেত্রে c(10, 20, 30, 40)। যদি আমরা মূল স্তরগুলি (সঠিক ক্রমে) জানি তবে আমরা মূল মানগুলিতে ফিরে যেতে পারি।

> orig_levels <- c(10, 20, 30, 40)
> x1 <- orig_levels[f]
> all.equal(x, x1)
[1] TRUE

এবং এটি কেবলমাত্র তখন কার্যকর হবে যখন মূল ডেটাতে সমস্ত সম্ভাব্য মানের জন্য লেবেল সংজ্ঞায়িত করা হয়।

সুতরাং আপনার যদি মূল মানগুলির প্রয়োজন হয় তবে আপনাকে সেগুলি রাখতে হবে। অন্যথায় একটি উচ্চ সম্ভাবনা রয়েছে কেবল কোনও ফ্যাক্টর থেকে তাদের কাছে ফিরে পাওয়া সম্ভব হবে না।


2

hablar::convertআপনার যদি কোনও ডেটা ফ্রেম থাকে তবে আপনি ব্যবহার করতে পারেন । বাক্য গঠন সহজ:

নমুনা df

library(hablar)
library(dplyr)

df <- dplyr::tibble(a = as.factor(c("7", "3")),
                    b = as.factor(c("1.5", "6.3")))

সমাধান

df %>% 
  convert(num(a, b))

আপনি দেয়:

# A tibble: 2 x 2
      a     b
  <dbl> <dbl>
1    7.  1.50
2    3.  6.30

অথবা আপনি যদি চান যে একটি কলামটি পূর্ণসংখ্যা এবং একটি সংখ্যাসূচক হয়:

df %>% 
  convert(int(a),
          num(b))

ফলাফল স্বরূপ:

# A tibble: 2 x 2
      a     b
  <int> <dbl>
1     7  1.50
2     3  6.30

0

সমাধানটি as.numeric (স্তর (চ)) এর মতো মনে হচ্ছে [চ] আর আর 4.0 এর সাথে আর কাজ করবে না।

বিকল্প সমাধান:

factor2number <- function(x){
    data.frame(levels(x), 1:length(levels(x)), row.names = 1)[x, 1]
}

factor2number(yourFactor)

-1

যে উত্তরগুলি আমি পড়তে পারি তার মধ্যে কেবলমাত্র একটি উপায় ছিল কারণগুলির সংখ্যা অনুসারে ভেরিয়েবলের সংখ্যা বাড়ানো। আপনার যদি "কুকুর" এবং "বিড়াল" স্তরগুলির সাথে একটি ভেরিয়েবল "পোষা প্রাণী" থাকে তবে আপনি পেট_ডগ এবং পোষা_ক্যাট দিয়ে শেষ করতে পারেন।

আমার ক্ষেত্রে আমি একই সংখ্যার ভেরিয়েবলের সাথে থাকতে চেয়েছি, কেবলমাত্র একটি সংখ্যাটির সাথে ফ্যাক্টর ভেরিয়েবলটি এমনভাবে অনুবাদ করে যে অনেক স্তরের সাথে অনেকগুলি ভেরিয়েবল প্রয়োগ করতে পারে, যাতে বিড়াল = 1 এবং কুকুর = 0 উদাহরণস্বরূপ।

দয়া করে নীচে সম্পর্কিত সমাধানটি সন্ধান করুন:

crime <- data.frame(city = c("SF", "SF", "NYC"),
                    year = c(1990, 2000, 1990),
                    crime = 1:3)

indx <- sapply(crime, is.factor)

crime[indx] <- lapply(crime[indx], function(x){ 
  listOri <- unique(x)
  listMod <- seq_along(listOri)
  res <- factor(x, levels=listOri)
  res <- as.numeric(res)
  return(res)
}
)

-2

খেলা দেরী, ঘটনাক্রমে, আমি দেখেছি trimws()রূপান্তর করতে পারেন factor(3:5)থেকে c("3","4","5")। তারপরে আপনি কল করতে পারেন as.numeric()। এটাই:

as.numeric(trimws(x_factor_var))

3
গ্রহণযোগ্য উত্তরে বর্ণিত হিসাবে আপনি কী ব্যবহার trimwsকরার পরামর্শ দেওয়ার কোনও কারণ আছে as.character? এটি আমার কাছে মনে হচ্ছে যদি না আপনি মুছে ফেলার জন্য প্রয়োজনীয় সাদা জায়গা না দিয়ে থাকেন, trimwsএকই ফলাফলটি ফেরত দেওয়ার জন্য কেবল অযৌক্তিক নিয়মিত অভিব্যক্তি কাজ করে যাচ্ছেন।
মিস্টারফ্লিক

as.numeric (স্তর (চ)) [চ] কিছুটা বিভ্রান্তিকর এবং শুরুর জন্য মনে রাখা কঠিন। ছাঁটাই কোনও ক্ষতি করে না।
জেরি টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.