मैं निम्नलिखित कोड के माध्यम से मैट्रिक्स की पंक्तियों और स्तंभों का नाम बदलने के लिए for लूप का उपयोग करने का प्रयास कर रहा हूं:

Z = matrix(c(1:120), 15, 8)
for (i in 1:15) {
  rownames(Z)[i] = paste0("[", format((-1)*(4-(i/10)), nsmall=1), "]")
}
for (j in 1:8) {
  colnames(Z)[j] = paste0("[", (j-1)/100, "]")
}

कंसोल में प्रवेश करने पर यह अपेक्षित रूप से काम करता है, और निम्न मैट्रिक्स Z उत्पन्न करता है:

       [.00] [.01] [.02] [.03] [.04] [.05] [.06] [.07]
[-3.9]     1    16    31    46    61    76    91   106
[-3.8]     2    17    32    47    62    77    92   107
[-3.7]     3    18    33    48    63    78    93   108
[-3.6]     4    19    34    49    64    79    94   109
[-3.5]     5    20    35    50    65    80    95   110
[-3.4]     6    21    36    51    66    81    96   111
[-3.3]     7    22    37    52    67    82    97   112
[-3.2]     8    23    38    53    68    83    98   113
[-3.1]     9    24    39    54    69    84    99   114
[-3.0]    10    25    40    55    70    85   100   115
[-2.9]    11    26    41    56    71    86   101   116
[-2.8]    12    27    42    57    72    87   102   117
[-2.7]    13    28    43    58    73    88   103   118
[-2.6]    14    29    44    59    74    89   104   119
[-2.5]    15    30    45    60    75    90   105   120

हालांकि, मुझे इसे एक आर मार्कडाउन दस्तावेज़ में शामिल करने की ज़रूरत है जो पीडीएफ से जुड़ा हुआ है, जैसा कि इस मेगावाट में है:

---
title: "Title"
author: "Author"
date: "1970-01-01"
output: pdf_document
---

```{r}
Z = matrix(c(1:120), 15, 8)
for (i in 1:15) {
  rownames(Z)[i] = paste0("[", format((-1)*(4-(i/10)), nsmall=1), "]")
}
for (j in 1:8) {
  colnames(Z)[j] = paste0("[", (j-1)/100, "]")
}
```

इस दस्तावेज़ को बुनने का प्रयास करते समय, आर मार्कडाउन त्रुटि देता है

Error in dimnames(x) <- dn : length of 'dimnames' [1] not equal to array extent

और निष्पादन रुक जाता है।

मैंने पाया कि उपरोक्त त्रुटि पर व्यापक रूप से चर्चा की गई है, लेकिन त्रुटि का कारण पंक्तियों या स्तंभों की संख्या के लिए बहुत कम या बहुत अधिक नाम देने का प्रयास करना है। हालांकि, यहां ऐसा नहीं होना चाहिए, और चूंकि कोड कंसोल में दर्ज होने पर इस त्रुटि को वापस नहीं करता है, इसलिए मैं मार्कडाउन को अस्वीकार करने का कोई कारण नहीं ढूंढ पा रहा हूं।

(मुझे एहसास है कि पंक्ति और स्तंभ नामों के लिए वैक्टर निर्दिष्ट करना पसंद किया जाता है, खासकर जब से नाम ज्ञात हैं; लेकिन यह एक विश्वविद्यालय वर्ग असाइनमेंट के लिए है जिसका उद्देश्य मुझे लूप से परिचित करना है, और इसलिए असाइनमेंट की आवश्यकता है कि सब कुछ होना चाहिए लूप के अंदर किया जाना चाहिए।)

मैं Windows 10 संस्करण 1909 बिल्ड 18363.1082 पर R संस्करण 3.6.2 और RStudio संस्करण 1.2.5033 का उपयोग कर रहा हूं। किसी भी मदद की सराहना की जाती है!

संपादित करें 1: @Wil द्वारा अनुरोधित sessionInfo() का आउटपुट:

R version 3.6.2 (2019-12-12)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 18363)

Matrix products: default

Random number generation:
 RNG:     Mersenne-Twister 
 Normal:  Inversion 
 Sample:  Rounding 
 
locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
 [1] compiler_3.6.2  htmltools_0.4.0 tools_3.6.2     yaml_2.2.0      Rcpp_1.0.3     
 [6] rmarkdown_2.0   knitr_1.26      digest_0.6.23   xfun_0.12       rlang_0.4.4    
[11] evaluate_0.14  
r
2
Shaman 28 सितंबर 2020, 04:45

1 उत्तर

सबसे बढ़िया उत्तर

एक मैट्रिक्स Z के लिए बिना किसी परिभाषित पंक्ति या कॉलम नाम के, rownames(Z) और colnames(Z) का मान NULL है। आपको यह त्रुटि इसलिए मिल रही है क्योंकि आप [i] को NULL में सम्मिलित करने का प्रयास कर रहे हैं, जो काम नहीं करता है।

Z = matrix(c(1:120), 15, 8)
rownames(Z) # NULL
rownames(Z)[1] # NULL 
rownames(Z)[1] <- "foo" 
# Error in dimnames(x) <- dn : length of 'dimnames' [1] not equal to array extent

ध्यान दें कि इस पर colnames()/rownames():

निर्माण जैसे

rownames(x)[3] <- "c"

काम नहीं कर सकता है जब तक कि x में पहले से ही डिमनाम न हों, क्योंकि यह पंक्तिनाम (x) के NULL मान से लंबाई -3 मान बनाएगा।

आप वेक्टरकृत इनपुट के साथ पंक्ति नाम निर्दिष्ट कर सकते हैं, जैसे:

rownames(Z) <- paste0("[", format((-1)*(4-(1:15/10)), nsmall=1), "]")

लेकिन आपकी पोस्ट से ऐसा लगता है कि यह अभ्यास for-लूप पर केंद्रित है। डॉक्स के अनुसार, यह एक नए मैट्रिक्स पर नाम सेट करने के लिए एक व्यवहार्य विकल्प नहीं है।

यदि आप विशुद्ध रूप से वेक्टरकृत दृष्टिकोण का उपयोग नहीं कर सकते हैं, तो निकटतम समाधान जिसमें for -लूप शामिल है, जिसके बारे में मैं सोच सकता हूं कि एक वेक्टर में पंक्तिनाम मानों को लूप करना है, फिर वेक्टर को rownames(Z) के रूप में असाइन करें। लेकिन यह एक अनावश्यक मध्य कदम की तरह लगता है, इसलिए मुझे यकीन नहीं है कि यह वास्तव में सीखने के लिए एक उपयोगी पैटर्न है।

new_rownames <- vector(mode = "character", length = nrow(Z))

for (i in 1:15) {
  new_rownames[i] = paste0("[", format((-1)*(4-(i/10)), nsmall=1), "]")
}

rownames(Z) <- new_rownames

एक अन्य विकल्प यह हो सकता है कि Z के लिए rownames/colnames के लिए मानों का एक खाली सेट असाइन किया जाए:

Z = matrix(c(1:120), 15, 8, dimnames = list(1:15, 1:8))

तब आप अपने मूल छोरों का उपयोग इरादा के अनुसार कर सकते थे।

1
andrew_reece 28 सितंबर 2020, 05:13