casting worksheet - जानकारी के नुकसान के बिना एक कारक को पूर्णांक \ numeric में कैसे परिवर्तित करें?




meaning english (5)

संकुल varhandle से 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"

जब मैं एक कारक को एक संख्यात्मक या पूर्णांक में परिवर्तित करता हूं, तो मुझे अंतर्निहित स्तर कोड मिलते हैं, न कि संख्याओं के रूप में मान।

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

क्या कारक को संख्यात्मक रूपांतरित करने का कोई बेहतर तरीका है?


कारकों को बदलने के लिए आर में कई (अनियंत्रित) सुविधा कार्य हैं:

  • 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 फ़ाइल में भी बेहतर हो सकते हैं।


यह केवल तभी संभव है जब कारक लेबल मूल मानों से मेल खाते हैं। मैं इसे एक उदाहरण के साथ समझाऊंगा।

मान लें कि डेटा वेक्टर 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"

2) मूल मूल्यों (10, 20, 30, 40) पर वापस लौटना संभव नहीं है, केवल f उपलब्ध है। हम देख सकते हैं कि 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

और यह केवल तभी काम करेगा जब मूल डेटा में सभी संभावित मानों के लिए लेबल परिभाषित किए गए हों।

तो अगर आपको मूल मूल्यों की आवश्यकता होगी, तो आपको उन्हें रखना होगा। अन्यथा एक उच्च मौका है कि केवल उन्हें एक कारक से वापस लेना संभव नहीं होगा।


?factor का चेतावनी अनुभाग देखें:

विशेष रूप से, as.numeric कि एक कारक पर लागू किया गया है, व्यर्थ है, और अंतर्निहित as.numeric से हो सकता है। एक कारक f को लगभग अपने मूल संख्यात्मक मानों में as.numeric(levels(f))[f] , as.numeric(levels(f))[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(as.character(f)) प्रभावी रूप से। as.numeric(levels(f)[f]) , इसलिए आप nlevels(x) मानों की बजाय length(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

जब तक आप प्रत्येक फ़ंक्शन में grobs = तर्क का उपयोग करके सूची निर्दिष्ट करते हैं, तब तक आप grid.arrange() और arrangeGrob() को सूचियों के साथ उपयोग कर सकते हैं। जैसे आपने दिया उदाहरण में:

library(ggplot2)
library(gridExtra)
df <- data.frame(x=1:10, y=rnorm(10))
p1 <- ggplot(df, aes(x,y)) + geom_point()
plist <- list(p1,p1,p1,p1,p1)

grid.arrange(grobs = plist, ncol = 2) ## display plot
ggsave(file = OutFileName, arrangeGrob(grobs = plist, ncol = 2))  ## save plot




r casting r-faq