R Language
सूचियाँ
खोज…
सूचियों का त्वरित परिचय
सामान्य तौर पर, एक उपयोगकर्ता के रूप में आप जिन वस्तुओं के साथ बातचीत करते हैं उनमें से अधिकांश एक वेक्टर के रूप में होती हैं; जैसे न्यूमेरिक वेक्टर, लॉजिकल वेक्टर। ये ऑब्जेक्ट केवल एक ही प्रकार के चर में ले सकते हैं (एक संख्यात्मक वेक्टर केवल इसके अंदर संख्याएं हो सकता है)।
एक सूची इसमें किसी भी प्रकार के चर को स्टोर करने में सक्षम होगी, जिससे यह जेनेरिक ऑब्जेक्ट के लिए होगा जो किसी भी प्रकार के चर को संग्रहीत कर सकता है जिसकी हमें आवश्यकता होगी।
किसी सूची को आरम्भ करने का उदाहरण
exampleList1 <- list('a', 'b')
exampleList2 <- list(1, 2)
exampleList3 <- list('a', 1, 2)
सूची में परिभाषित डेटा को समझने के लिए, हम str फ़ंक्शन का उपयोग कर सकते हैं।
str(exampleList1)
str(exampleList2)
str(exampleList3)
सूचियों की सबसेटिंग सूची के एक स्लाइस को निकालने के बीच अंतर करती है, अर्थात मूल सूची में तत्वों के सबसेट वाली एक सूची प्राप्त करना और एक तत्व को निकालना। वैक्टर के लिए आमतौर पर उपयोग किए जाने वाले [
संचालक का उपयोग करना] एक नई सूची तैयार करता है।
# Returns List
exampleList3[1]
exampleList3[1:2]
एक एकल तत्व का उपयोग करने के लिए [[
बजाय
# Returns Character
exampleList3[[1]]
सूची प्रविष्टियों का नाम दिया जा सकता है:
exampleList4 <- list(
num = 1:3,
numeric = 0.5,
char = c('a', 'b')
)
नामित सूचियों की प्रविष्टियों को उनके सूचकांक के बजाय उनके नाम से एक्सेस किया जा सकता है।
exampleList4[['char']]
वैकल्पिक रूप से $
ऑपरेटर का उपयोग नामित तत्वों तक पहुंचने के लिए किया जा सकता है।
exampleList4$num
इसका यह फायदा है कि यह तेजी से टाइप होता है और पढ़ने में आसान हो सकता है लेकिन संभावित नुकसान के बारे में पता होना जरूरी है। $
ऑपरेटर मिलान सूची तत्वों की पहचान करने के लिए आंशिक मिलान का उपयोग करता है और अप्रत्याशित परिणाम उत्पन्न कर सकता है।
exampleList5 <- exampleList4[2:3]
exampleList4$num
# c(1, 2, 3)
exampleList5$num
# 0.5
exampleList5[['num']]
# NULL
सूचियाँ विशेष रूप से उपयोगी हो सकती हैं क्योंकि वे विभिन्न लंबाई और विभिन्न वर्गों की वस्तुओं को संग्रहीत कर सकती हैं।
## Numeric vector
exampleVector1 <- c(12, 13, 14)
## Character vector
exampleVector2 <- c("a", "b", "c", "d", "e", "f")
## Matrix
exampleMatrix1 <- matrix(rnorm(4), ncol = 2, nrow = 2)
## List
exampleList3 <- list('a', 1, 2)
exampleList6 <- list(
num = exampleVector1,
char = exampleVector2,
mat = exampleMatrix1,
list = exampleList3
)
exampleList6
#$num
#[1] 12 13 14
#
#$char
#[1] "a" "b" "c" "d" "e" "f"
#
#$mat
# [,1] [,2]
#[1,] 0.5013050 -1.88801542
#[2,] 0.4295266 0.09751379
#
#$list
#$list[[1]]
#[1] "a"
#
#$list[[2]]
#[1] 1
#
#$list[[3]]
#[1] 2
सूचियों का परिचय
सूचियाँ उपयोगकर्ताओं को एक ही वस्तु के तहत कई तत्वों (जैसे वैक्टर और मैट्रेस) को संग्रहीत करने की अनुमति देती हैं। list
बनाने के list
आप list
फ़ंक्शन का उपयोग कर सकते हैं:
l1 <- list(c(1, 2, 3), c("a", "b", "c"))
l1
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [1] "a" "b" "c"
ध्यान दें कि उपरोक्त सूची बनाने वाले वैक्टर अलग-अलग वर्ग हैं। सूचियाँ उपयोगकर्ताओं को विभिन्न वर्गों के समूह तत्वों की अनुमति देती हैं। सूची में प्रत्येक तत्व का एक नाम भी हो सकता है। सूची नामों को names
फ़ंक्शन द्वारा एक्सेस किया जाता है, और एक ही तरीके से पंक्तिबद्ध किया जाता है और एक मैट्रिक्स में कॉलम नाम निर्दिष्ट किए जाते हैं।
names(l1)
## NULL
names(l1) <- c("vector1", "vector2")
l1
## $vector1
## [1] 1 2 3
##
## $vector2
## [1] "a" "b" "c"
सूची ऑब्जेक्ट बनाते समय सूची नामों की घोषणा करना अक्सर आसान और सुरक्षित होता है।
l2 <- list(vec = c(1, 3, 5, 7, 9),
mat = matrix(data = c(1, 2, 3), nrow = 3))
l2
## $vec
## [1] 1 3 5 7 9
##
## $mat
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
names(l2)
## [1] "vec" "mat"
सूची के ऊपर दो तत्व हैं, जिसका नाम "vec" और "mat" है, एक सदिश और मैट्रिक्स, resepcively।
सूचियों का उपयोग करने के कारण
औसत आर उपयोगकर्ता के लिए, सूची संरचना हेरफेर करने के लिए अधिक जटिल डेटा संरचनाओं में से एक हो सकती है। इस बात की कोई गारंटी नहीं है कि इसके भीतर के सभी तत्व एक ही प्रकार के हैं; इस बात की कोई गारंटी नहीं है कि सूची कितनी जटिल / गैर-जटिल है (सूची में एक तत्व एक सूची हो सकती है)
हालांकि, मुख्य कारणों में से एक जब कार्यों के बीच मापदंडों को पारित करने के लिए इसका उपयोग करने के लिए सूचियों का उपयोग करना है।
# Function example which returns a single element numeric vector
exampleFunction1 <- function(num1, num2){
result <- num1 + num2
return(result)
}
# Using example function 1
exampleFunction1(1, 2)
# Function example which returns a simple numeric vector
exampleFunction2 <- function(num1, num2, multiplier){
tempResult1 <- num1 + num2
tempResult2 <- tempResult1 * multiplier
result <- c(tempResult1, tempResult2)
return(result)
}
# Using example function 2
exampleFunction2(1, 2, 4)
उपरोक्त उदाहरण में, दिए गए परिणाम केवल साधारण संख्यात्मक वैक्टर हैं। ऐसे सरल वैक्टरों को पारित करने के लिए कोई समस्या नहीं है।
इस बिंदु पर ध्यान देना महत्वपूर्ण है कि आम तौर पर, आर फ़ंक्शन केवल एक समय में 1 परिणाम लौटाता है (यदि आप विभिन्न परिणामों को वापस करने के लिए शर्तों का उपयोग कर सकते हैं)। हालाँकि, यदि आप एक फ़ंक्शन बनाने का इरादा रखते हैं, जो मापदंडों का एक सेट लेता है और कई प्रकार के परिणाम लौटाता है जैसे कि संख्यात्मक वेक्टर (सेटिंग्स मान) और डेटा फ्रेम (गणना से), तो आपको इन सभी परिणामों को एक सूची में डंप करना होगा इसे वापस करने से पहले।
# We will be using mtcars dataset here
# Function which returns a result that is supposed to contain multiple type of results
# This can be solved by putting the results into a list
exampleFunction3 <- function(dataframe, removeColumn, sumColumn){
resultDataFrame <- dataframe[, -removeColumn]
resultSum <- sum(dataframe[, sumColumn])
resultList <- list(resultDataFrame, resultSum)
return(resultList)
}
# Using example function 3
exampleResult <- exampleFunction3(mtcars, 2, 4)
exampleResult[[1]]
exampleResult[[2]]
खाली सूची तत्वों को रखते हुए एक सूची को वेक्टर में बदलें
जब कोई सूची को वेक्टर या डेटा.फ्रेम ऑब्जेक्ट में परिवर्तित करना चाहता है, तो खाली तत्व आमतौर पर गिरा दिए जाते हैं।
यह समस्याग्रस्त हो सकता है जो एक सूची वांछित लंबाई से बनाई गई है, कुछ खाली मानों के साथ बनाई गई हैं (उदाहरण के लिए n तत्वों के साथ एक सूची को एक mxn मैट्रिक्स, data.frame, या data.table में जोड़ा जा सकता है)। यह संभव है कि दोषरहित सूची को सदिश में बदलना संभव है, लेकिन खाली तत्वों को बनाए रखना है:
res <- list(character(0), c("Luzhuang", "Laisu", "Peihui"), character(0),
c("Anjiangping", "Xinzhai", "Yongfeng"), character(0), character(0),
c("Puji", "Gaotun", "Banjingcun"), character(0), character(0),
character(0))
res
[[1]] character(0) [[2]] [1] "Luzhuang" "Laisu" "Peihui" [[3]] character(0) [[4]] [1] "Anjiangping" "Xinzhai" "Yongfeng" [[5]] character(0) [[6]] character(0) [[7]] [1] "Puji" "Gaotun" "Banjingcun" [[8]] character(0) [[9]] character(0) [[10]] character(0)
res <- sapply(res, function(s) if (length(s) == 0) NA_character_ else paste(s, collapse = " "))
res
[1] NA "Luzhuang Laisu Peihui" NA "Anjiangping Xinzhai Yongfeng" NA [6] NA "Puji Gaotun Banjingcun" NA NA NA
क्रमांकन: informations पास करने के लिए सूचियों का उपयोग करना
ऐसे मामले मौजूद हैं जिनमें विभिन्न प्रकार के डेटा को एक साथ रखना आवश्यक है। उदाहरण के लिए एज़्योर एमएल में, आर स्क्रिप्ट मॉड्यूल से दूसरे में विशेष रूप से डेटाफ़्रेम के माध्यम से एक को पास करना आवश्यक है। मान लीजिए कि हमारे पास एक डेटाफ्रेम और एक संख्या है:
> df
name height team fun_index title age desc Y
1 Andrea 195 Lazio 97 6 33 eccellente 1
2 Paja 165 Fiorentina 87 6 31 deciso 1
3 Roro 190 Lazio 65 6 28 strano 0
4 Gioele 70 Lazio 100 0 2 simpatico 1
5 Cacio 170 Juventus 81 3 33 duro 0
6 Edola 171 Lazio 72 5 32 svampito 1
7 Salami 175 Inter 75 3 30 doppiopasso 1
8 Braugo 180 Inter 79 5 32 gjn 0
9 Benna 158 Juventus 80 6 28 esaurito 0
10 Riggio 182 Lazio 92 5 31 certezza 1
11 Giordano 185 Roma 79 5 29 buono 1
> number <- "42"
हम इस जानकारी तक पहुँच सकते हैं:
> paste(df$name[4],"is a",df3$team[4], "supporter." )
[1] "Gioele is a Lazio supporter."
> paste("The answer to THE question is", number )
[1] "The answer to THE question is 42"
डेटाफ़्रेम में विभिन्न प्रकार के डेटा डालने के लिए हमें सूची ऑब्जेक्ट और क्रमांकन का उपयोग करना होगा। विशेष रूप से हमें डेटा को जेनेरिक सूची में रखना होगा और फिर सूची को किसी विशेष डेटाफ़्रेम में डालना होगा:
l <- list(df,number)
dataframe_container <- data.frame(out2 = as.integer(serialize(l, connection=NULL)))
एक बार जब हम डेटाफ़्रेम में जानकारी संग्रहीत कर लेते हैं, तो हमें इसका उपयोग करने के लिए इसे और अधिक निष्क्रिय करने की आवश्यकता होती है:
#----- unserialize ----------------------------------------+
unser_obj <- unserialize(as.raw(dataframe_container$out2))
#----- taking back the elements----------------------------+
df_mod <- unser_obj[1][[1]]
number_mod <- unser_obj[2][[1]]
फिर, हम सत्यापित कर सकते हैं कि डेटा सही तरीके से स्थानांतरित किया गया है:
> paste(df_mod$name[4],"is a",df_mod$team[4], "supporter." )
[1] "Gioele is a Lazio supporter."
> paste("The answer to THE question is", number_mod )
[1] "The answer to THE question is 42"