R Language
स्प्लिट फंक्शन
खोज…
विभाजन का मूल उपयोग
split
एक वेक्टर या एक data.frame को एक कारक / समूह चर के संबंध में बाल्टी में विभाजित करने की अनुमति देता है। बाल्टी में यह वेंटिलेशन एक सूची के रूप में, कि तब (समूह-वार गणना लागू करने के लिए इस्तेमाल किया जा सकता लेता है for
छोरों या lapply
/ sapply
)।
पहला उदाहरण वेक्टर पर split
के उपयोग को दर्शाता है:
पत्रों के निम्नलिखित वेक्टर पर विचार करें:
testdata <- c("e", "o", "r", "g", "a", "y", "w", "q", "i", "s", "b", "v", "x", "h", "u")
उद्देश्य उन अक्षरों को voyels
और consonants
में अलग करना है, अर्थात अक्षर प्रकार के अनुसार विभाजित करना।
आइए सबसे पहले एक समूहीकरण वेक्टर बनाएँ:
vowels <- c('a','e','i','o','u','y')
letter_type <- ifelse(testdata %in% vowels, "vowels", "consonants")
ध्यान दें कि letter_type
कि हमारे वेक्टर लम्बाई समान होती है testdata
। अब हम इस परीक्षण डेटा को दो समूहों, vowels
और consonants
में split
कर सकते हैं:
split(testdata, letter_type)
#$consonants
#[1] "r" "g" "w" "q" "s" "b" "v" "x" "h"
#$vowels
#[1] "e" "o" "a" "y" "i" "u"
इसलिए, परिणाम एक सूची है जो नाम हमारे समूहीकरण वेक्टर / कारक letter_type
से आ रहे हैं।
split
में डेटा.फ्रेम से निपटने की भी विधि है।
उदाहरण के लिए iris
डेटा पर विचार करें:
data(iris)
split
का उपयोग करके, कोई एक सूची बना सकता है जिसमें एक डेटा हो। प्रति आईरिस स्पेसी (चर: प्रजाति):
> liris <- split(iris, iris$Species)
> names(liris)
[1] "setosa" "versicolor" "virginica"
> head(liris$setosa)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
(सेटोसा समूह के लिए केवल डेटा शामिल है)।
एक उदाहरण ऑपरेशन इरिस स्पेक प्रति सहसंबंध मैट्रिक्स की गणना करने के लिए होगा; एक तो lapply
उपयोग lapply
:
> (lcor <- lapply(liris, FUN=function(df) cor(df[,1:4])))
$setosa
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 0.7425467 0.2671758 0.2780984
Sepal.Width 0.7425467 1.0000000 0.1777000 0.2327520
Petal.Length 0.2671758 0.1777000 1.0000000 0.3316300
Petal.Width 0.2780984 0.2327520 0.3316300 1.0000000
$versicolor
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 0.5259107 0.7540490 0.5464611
Sepal.Width 0.5259107 1.0000000 0.5605221 0.6639987
Petal.Length 0.7540490 0.5605221 1.0000000 0.7866681
Petal.Width 0.5464611 0.6639987 0.7866681 1.0000000
$virginica
Sepal.Length Sepal.Width Petal.Length Petal.Width
Sepal.Length 1.0000000 0.4572278 0.8642247 0.2811077
Sepal.Width 0.4572278 1.0000000 0.4010446 0.5377280
Petal.Length 0.8642247 0.4010446 1.0000000 0.3221082
Petal.Width 0.2811077 0.5377280 0.3221082 1.0000000
तब हम प्रति समूह में सहसंबद्ध चर की सर्वश्रेष्ठ जोड़ी को पुनः प्राप्त कर सकते हैं: (सहसंबंध मैट्रिक्स को फिर से आकार दिया / पिघलाया जाता है, विकर्ण को फ़िल्टर किया जाता है और सर्वश्रेष्ठ रिकॉर्ड का चयन किया जाता है)
> library(reshape)
> (topcor <- lapply(lcor, FUN=function(cormat){
correlations <- melt(cormat,variable_name="correlatio);
filtered <- correlations[correlations$X1 != correlations$X2,];
filtered[which.max(filtered$correlation),]
}))
$setosa
X1 X2 correlation
2 Sepal.Width Sepal.Length 0.7425467
$versicolor
X1 X2 correlation
12 Petal.Width Petal.Length 0.7866681
$virginica
X1 X2 correlation
3 Petal.Length Sepal.Length 0.8642247
ध्यान दें कि इस तरह के समूहवार स्तर पर एक संगणना की जाती है, एक परिणाम को स्टैक करने में रुचि हो सकती है, जो इसके साथ किया जा सकता है:
> (result <- do.call("rbind", topcor))
X1 X2 correlation
setosa Sepal.Width Sepal.Length 0.7425467
versicolor Petal.Width Petal.Length 0.7866681
virginica Petal.Length Sepal.Length 0.8642247
स्प्लिट-अप्लाई-कॉम्बिनेशन प्रतिमान में विभाजन का उपयोग करना
डेटा विश्लेषण का एक लोकप्रिय रूप विभाजन-लागू-संयोजन है , जिसमें आप अपने डेटा को समूहों में विभाजित करते हैं, प्रत्येक समूह पर किसी प्रकार का प्रसंस्करण लागू करते हैं, और फिर परिणामों को जोड़ते हैं।
आइए एक डेटा विश्लेषण पर विचार करें, जहां हम अंतर्निहित mtcars डेटासेट में प्रत्येक सिलेंडर गणना (सिलेंडर) के लिए दो मील प्रति गैलन (mpg) के साथ दो कारों को प्राप्त करना चाहते हैं। सबसे पहले, हम mtcars
डेटा फ्रेम को सिलेंडर गणना द्वारा विभाजित करते हैं:
(spl <- split(mtcars, mtcars$cyl))
# $`4`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
# Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
# Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
# Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# ...
#
# $`6`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
# Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
# Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
# ...
#
# $`8`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
# Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
# Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
# Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
# ...
इसने डेटा फ्रेम की एक सूची दी है, प्रत्येक सिलेंडर गिनती के लिए। जैसा कि आउटपुट से संकेत मिलता है, हम spl$`4`
, spl$`6`
, और spl$`8`
साथ प्रासंगिक डेटा फ्रेम प्राप्त कर सकते हैं (कुछ इसे spl$"4"
या spl[["4"]]
का उपयोग करने के लिए अधिक नेत्रहीन अपील कर सकते हैं) spl[["4"]]
बजाय)।
अब, हम इस सूची के माध्यम से lapply
का उपयोग कर सकते हैं, हमारे फ़ंक्शन को लागू कर सकते हैं जो प्रत्येक सूची तत्वों में से सर्वश्रेष्ठ 2 mpg मूल्यों वाली कारों को निकालता है:
(best2 <- lapply(spl, function(x) tail(x[order(x$mpg),], 2)))
# $`4`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#
# $`6`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
# Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#
# $`8`
# mpg cyl disp hp drat wt qsec vs am gear carb
# Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
# Pontiac Firebird 19.2 8 400 175 3.08 3.845 17.05 0 0 3 2
अंत में, हम rbind
का उपयोग करके सब कुछ एक साथ जोड़ सकते हैं। हम rbind(best2[["4"]], best2[["6"]], best2[["8"]])
को कॉल करना चाहते हैं, लेकिन यह एक बड़ी सूची होने पर थकाऊ होगा। परिणामस्वरूप, हम उपयोग करते हैं:
do.call(rbind, best2)
# mpg cyl disp hp drat wt qsec vs am gear carb
# 4.Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
# 4.Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
# 6.Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
# 6.Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
# 8.Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
# 8.Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
यह रिटर्न का परिणाम rbind
के सभी तत्वों के साथ (तर्क 1, एक समारोह) best2
(तर्क 2, एक सूची) तर्क के रूप में पारित।
इस तरह के सरल विश्लेषणों के साथ, यह कोड की एकल पंक्ति में संपूर्ण विभाजन-लागू-संयोजन करने के लिए अधिक कॉम्पैक्ट (और संभवतः बहुत कम पठनीय!) हो सकता है:
do.call(rbind, lapply(split(mtcars, mtcars$cyl), function(x) tail(x[order(x$mpg),], 2)))
यह भी ध्यान देने योग्य है कि lapply(split(x,f), FUN)
संयोजन को वैकल्पिक रूप ?by
फ़ंक्शन के उपयोग से नाम दिया जा सकता है ?by
by(mtcars, mtcars$cyl, function(x) tail(x[order(x$mpg),], 2))
do.call(rbind, by(mtcars, mtcars$cyl, function(x) tail(x[order(x$mpg),], 2)))