Google शीट में अनंत सचाई गतिशील रेंज पर औसत का ArrayFormula
उदाहरण के अनुसार:
A B C D E F G ∞
|======|=======|=====|=====|=====|=====|=====|=====
1 | |AVERAGE| | | | | |
|======|=======|=====|=====|=====|=====|=====|=====
2 | xx 1 | | 1 | 2 | 0.5 | 10 | |
|======|=======|=====|=====|=====|=====|=====|=====
3 | xx 2 | | 7 | 1 | | | |
|======|=======|=====|=====|=====|=====|=====|=====
4 | | | 0 | | | | |
|======|=======|=====|=====|=====|=====|=====|=====
5 | xx 3 | | 9 | 8 | 7 | 6 | |
|======|=======|=====|=====|=====|=====|=====|=====
6 | xx 4 | | 0 | 1 | 2 | 1 | |
|======|=======|=====|=====|=====|=====|=====|=====
7 | | | 1 | | 4 | | |
|======|=======|=====|=====|=====|=====|=====|=====
8 | xx 5 | | | | | | |
|======|=======|=====|=====|=====|=====|=====|=====
9 | | | | | | | 5 |
|======|=======|=====|=====|=====|=====|=====|=====
∞ | | | | | | | |
AVERAGE
शब्दों के गतिशील अर्थ (अज्ञात मात्रा में पंक्तियों और स्तंभों की अज्ञात मात्रा) में प्रत्येक वैध पंक्ति के लिए सबसे इष्टतम तरीका क्या है ?
जवाब
क्वेरी के
स्तर 1:
अगर C2 में सभी 5 सेल हैं : G में मान हैं:
=QUERY(QUERY(C2:G, "select (C+D+E+F+G)/5"), "offset 1", )
यदि नहीं, तो पंक्तियाँ छोड़ दी जाती हैं:
यदि खाली कोशिकाओं को शून्य माना जाता है:
=INDEX(QUERY(QUERY({C2:G*1}, "select (Col1+Col2+Col3+Col4+Col5)/5"), "offset 1", ))
शून्य मानों को हटाने के लिए जिनका हम उपयोग करते हैं IFERROR(1/(1/...))
:
=INDEX(IFERROR(1/(1/QUERY(QUERY({C2:G*1},
"select (Col1+Col2+Col3+Col4+Col5)/5"), "offset 1", ))))
Col
संदर्भों को गतिशील बनाने के लिए हम कर सकते हैं:
=INDEX(IFERROR(1/(1/QUERY(QUERY({C2:G*1},
"select "&
"("&JOIN("+", "Col"&ROW(INDIRECT("1:"&COLUMNS(C:G))))&")/"&COLUMNS(C:G)),
"offset 1", ))))
लेवल 2:
यदि खाली कोशिकाओं को शून्य के रूप में नहीं माना जाता है और उन्हें छोड़ नहीं दिया जाना चाहिए:
=INDEX(TRANSPOSE(QUERY(TRANSPOSE(E2:I),
"select "&TEXTJOIN(",", 1, IF(A2:A="",,
"avg(Col"&ROW(A2:A)-ROW(A2)+1&")")))),, 2)
ध्यान दें कि यह कॉलम ए निर्भर है, इसलिए कॉलम ए में लापता मान परिणामों को ऑफसेट करेगा
मजेदार तथ्य !! हम स्वैप कर सकते हैं avg
करने के लिए max
या min
:
कॉलम A के कारावास से इसे मुक्त करने और किसी भी मान्य पंक्ति के लिए यह कार्य करने के लिए:
=INDEX(IFERROR(1/(1/TRANSPOSE(QUERY(TRANSPOSE(
IF(TRIM(TRANSPOSE(QUERY(TRANSPOSE(C2:G),,9^9)))="", C2:G*0, C2:G)),
"select "&TEXTJOIN(",", 1,
"avg(Col"&ROW(A2:A)-ROW(A2)+1&")"))))),, 2)
यदि वर्तमान 0 की सीमा औसत नहीं होनी चाहिए तो हम एक छोटा सा IF स्टेटमेंट जोड़ सकते हैं:
=INDEX(IFERROR(1/(1/TRANSPOSE(QUERY(TRANSPOSE(
IF(TRIM(TRANSPOSE(QUERY(TRANSPOSE(
IF(C2:G>0, C2:G, )),,9^9)))="", C2:G*0,
IF(C2:G>0, C2:G, ))),
"select "&TEXTJOIN(",", 1,
"avg(Col"&ROW(A2:A)-ROW(A2)+1&")"))))),, 2)
यहाँ हमने तथाकथित "वर्टिकल क्वेरी स्मैश" का इस्तेमाल किया है, जो किसी दिए गए रेंज में सभी मान लेता है और इसे एक सिंगल कॉलम पर केंद्रित करता है, जहाँ प्रत्येक पंक्ति की सभी कोशिकाएँ एक खाली स्थान के साथ एक प्रतिफल के रूप में जुड़ जाती हैं:
=FLATTEN(QUERY(TRANSPOSE(C2:G),,9^9))
इसके अलावा, "क्षैतिज क्वेरी स्मैश" भी है :
=QUERY(C2:G,,9^9)
और "अल्टीमेट 360 ° डबल क्वेरी स्मैश" जो सभी सेल्स को एक सिंगल सेल में रेंज से डालता है:
=QUERY(FLATTEN(QUERY(TRANSPOSE(C2:G),,9^9)),,9^9)
और अंत में "कुख्यात नकारात्मक 360 ° रिवर्स डबल क्वेरी स्मैश" जो पंक्तियों पर कॉलम को प्राथमिकता देता है:
=QUERY(FLATTEN(QUERY(C2:G,,9^9)),,9^9)
सभी क्वेरी स्मैश नामों का कॉपीराइट किया जाता है
इस विषय पर वापस ... जैसा कि ऊपर प्रति पंक्ति में सभी कक्षों के ऊपर उल्लेख किया गया है, रिक्त स्थान के साथ भी रिक्त स्थान शामिल हैं, इसलिए हमें एक ऐसी स्थिति मिली जहां हम मूल्यों के बीच डबल या कई रिक्त स्थान प्राप्त कर रहे हैं। इसे ठीक करने के लिए हम दिए गए रेंज में खाली पंक्तियों के लिए 0 मान निर्दिष्ट करने के लिए TRIM
एक सरल IF
कथन का उपयोग करते हैं और पेश करते हैं। ऑफ़सेट का सामना करने के लिए:
MMULT
स्तर 3:
MMULT
एक प्रकार का भारी वर्ग सूत्र है जो जोड़, घटाव, गुणन, विभाजन को पूरा करने में सक्षम है, यहाँ तक कि सरणियों / मैट्रिक्स पर कुल चल रहा है ... हालाँकि, बड़ा डेटासेट = सूत्र गणना को धीमा करता है (क्योंकि MMULT
खाली पंक्तियों में भी + - × ÷
ऑपरेशन करने में समय लगता है ) ... जब तक कि हम दोनों दिशाओं में वास्तव में गतिशील रेंज का उपयोग न करें ...
दी गई सीमा के मानों के साथ अंतिम पंक्ति प्राप्त करने के लिए:
=INDEX(MAX(IF(TRIM(FLATTEN(QUERY(TRANSPOSE(
INDIRECT("C2:"&ROWS(A:A))),,9^9)))="",,ROW(A2:A))))
किसी दिए गए रेंज के मानों के साथ अंतिम कॉलम पाने के लिए:
=INDEX(MAX(IF(TRIM(QUERY(INDIRECT("C2:"&ROWS(A:A)),,9^9))="",,COLUMN(C2:2))))
अब हम इसे सरल तरीके से बना सकते हैं:
=INDIRECT("C2:"&ADDRESS(9, 7))
जो इस प्रकार है:
=INDEX(INDIRECT("C2:"&ADDRESS(MAX(IF(TRIM(FLATTEN(QUERY(TRANSPOSE(
INDIRECT("C2:"&ROWS(A:A))),,9^9)))="",,ROW(A2:A))),
MAX(IF(TRIM(QUERY(INDIRECT("C2:"&ROWS(A:A)),,9^9))="",,COLUMN(C2:2))))))
या कम विकल्प:
=INDEX(INDIRECT("C2:"&ADDRESS(
MAX((INDIRECT("C2:"&ROWS(A:A))<>"")*ROW(A2:A)),
MAX((INDIRECT("C2:"&ROWS(A:A))<>"")*COLUMN(C2:2)))))
इसलिए सरलीकृत MMULT फॉर्मूला होगा:
=ARRAYFORMULA(IFERROR(
MMULT(N( C2:G9), ROW(INDIRECT("C1:C"&COLUMNS(C:G)))^0)/
MMULT(N(IF(C2:G9<>"", 1, )), ROW(INDIRECT("C1:C"&COLUMNS(C:G)))^0)))
यदि हम शून्य मानों को श्रेणी से बाहर करना चाहते हैं, तो सूत्र यह होगा:
=ARRAYFORMULA(IFERROR(
MMULT(N( C2:G9), ROW(INDIRECT("C1:C"&COLUMNS(C:G)))^0)/
MMULT(N(IF(C2:G9>0, 1, )), ROW(INDIRECT("C1:C"&COLUMNS(C:G)))^0)))
स्तर 4:
इसे अनंत गतिशील बनाने के लिए और फिर भी वैध डेटासेट तक सीमित रखने के लिए सभी को एक साथ रखना:
=INDEX(IFERROR(
MMULT(N( INDIRECT("C2:"&ADDRESS(
MAX((INDIRECT("C2:"&ROWS(A:A))<>"")*ROW(A2:A)),
MAX((INDIRECT("C2:"&ROWS(A:A))<>"")*COLUMN(C2:2))))), ROW(INDIRECT("C1:C"&
MAX((INDIRECT("C2:"&ROWS(A:A))<>"")*COLUMN(C2:2))-(COLUMN(C2)-1)))^0)/
MMULT(N(IF(INDIRECT("C2:"&ADDRESS(
MAX((INDIRECT("C2:"&ROWS(A:A))<>"")*ROW(A2:A)),
MAX((INDIRECT("C2:"&ROWS(A:A))<>"")*COLUMN(C2:2))))<>"", 1, )), ROW(INDIRECT("C1:C"&
MAX((INDIRECT("C2:"&ROWS(A:A))<>"")*COLUMN(C2:2))-(COLUMN(C2)-1)))^0)))
फिर से, श्रेणी में शून्य वाले सेल शामिल नहीं हैं:
सम्मानपूर्वक उल्लेख:
@ एरिक टायलर स्तर:
पिछले सूत्र के ध्रुवीय विपरीत को चलाने के लिए MMULT
होगा
- के बजाय कुल क्षेत्रफल
C2:?
(all rows, all columns)
- वैध क्षेत्र जो की बड़े पैमाने पर गणना से बचा जाता है
C2:?
(excluding empty rows and columns)
0 × 0 = 0
शून्य सहित:
=INDEX(IFERROR(
MMULT( INDIRECT("C2:"&ROWS(C:C))*1, SEQUENCE(COLUMNS(C2:2))^0)/
MMULT(IF(INDIRECT("C2:"&ROWS(C:C))<>"", 1)*1, SEQUENCE(COLUMNS(C2:2))^0)))
शून्य को छोड़कर:
=INDEX(IFERROR(
MMULT( INDIRECT("C2:"&ROWS(C:C))*1, SEQUENCE(COLUMNS(C2:2))^0)/
MMULT(IF(INDIRECT("C2:"&ROWS(C:C))>0, 1)*1, SEQUENCE(COLUMNS(C2:2))^0)))
@ किस्किन स्तर:
एक निश्चित सीमा के C2:G9
लिए MMULT
औसत होगा:
=INDEX(IFERROR(
MMULT( C2:G9*1, FLATTEN(COLUMN(C:G))^0)/
MMULT((C2:G9>0)*1, FLATTEN(COLUMN(C:G))^0)))
=INDEX(IFNA(VLOOKUP(ROW(C2:C),
QUERY(SPLIT(FLATTEN(ROW(C2:C)&"×"&C2:J), "×"),
"select Col1,avg(Col2)
where Col2 is not null
group by Col1"), 2, )))
@ मैटिंग स्तर:
=INDEX(QUERY(SPLIT(FLATTEN(ROW(C2:C)&"×"&OFFSET(C2,,,9^9, 9^9)), "×"),
"select avg(Col2)
group by Col1
label avg(Col2)''"))
शून्य को छोड़कर:
=INDEX(QUERY(SPLIT(FLATTEN(ROW(C2:C)&"×"&OFFSET(C2,,,9^9, 9^9)), "×"),
"select avg(Col2)
where Col2 <> 0
group by Col1
label avg(Col2)''"))
खाली सेल सहित:
=INDEX(IFERROR(1/(1/QUERY(SPLIT(FLATTEN(ROW(C2:C)&"×"&OFFSET(C2,,,9^9, 9^9)*1), "×"),
"select avg(Col2)
group by Col1
label avg(Col2)''"))))
आपने इसमें एक टन समय लगाया। मुझे उम्मीद है कि लोग इसकी सराहना करेंगे, और अधिक ताकि आप इसे बाकी सभी के लिए करें और अपने लिए नहीं।
अपने अंतिम फ़ार्मुलों को देखते हुए, ये समान परिणाम उत्पन्न करने चाहिए (C2 में डेटा दें: अपने उदाहरणों में):
B2 में (शून्य शामिल करें):
=ArrayFormula(IFERROR(MMULT(INDIRECT("C2:"&ROWS(C:C))*1,SEQUENCE(COLUMNS(C1:1),1,1,0))/ MMULT(IF(INDIRECT("C2:"&ROWS(C:C))<>"",1,0),SEQUENCE(COLUMNS(C1:1),1,1,0))))
बी 2 (शून्य को छोड़कर) में:
=ArrayFormula(IFERROR(MMULT(INDIRECT("C2:"&ROWS(C:C))*1,SEQUENCE(COLUMNS(C1:1),1,1,0))/ MMULT(IF(INDIRECT("C2:"&ROWS(C:C))<>0,1,0),SEQUENCE(COLUMNS(C1:1),1,1,0))))
अद्यतन: मैंने अपने मूल पोस्ट से सूत्र अपडेट किया है। आरओडब्ल्यू () को हमेशा पहले आना चाहिए ताकि डेटा में लापता मान विभाजन को फेंक न दें।
=ARRAYFORMULA(QUERY(SPLIT(FLATTEN(ROW(C2:C)&"|"&OFFSET(C2,,,9^9,9^9)),"|"),"select AVG(Col2) group by Col1 label AVG(Col2)''"))
तब तक काम करना चाहिए जब तक मैं प्रश्न को गलत नहीं समझ लेता।
Vlookups या mmults या फिल्टर या कुछ भी करने के लिए कोई ज़रूरत नहीं है।
मैं @ player0 के उत्तर के लिए थोड़ा अतिरिक्त बनाने की कोशिश करूंगा। और मैं वास्तव में इस के अनुकूलन पर किसी भी टिप्पणी की सराहना करूंगा।
मामले में डेटा श्रेणी के अंदर बहुत सी खाली पंक्तियाँ और स्तंभ होते हैं, जिन्हें बाहर रखा जा सकता है MMULT
।
चरण 1 - खाली पंक्तियों को फ़िल्टर करें
हमें एक डेटा श्रेणी मिली है: C2
नीचे से अंतिम पंक्ति और दाईं ओर अंतिम कॉलम (जो है J:J
)। मैं C2:K
स्पष्टीकरण के लिए नीचे दिए गए विवरणों का उपयोग करूंगा ।
यह सूत्र हमें पंक्ति संख्याओं की एक सरणी देगा जहां कम से कम एक गैर रिक्त सेल है। इसके अलावा, 0
अगर कोई खाली पंक्तियाँ होंगी, लेकिन यह इस सरणी में खोज के लिए कोई मायने नहीं रखेगा, या हम इसे तब फ़िल्टर करेंगे जब यह काम करेगा:
=ARRAYFORMULA(
UNIQUE(FLATTEN((C2:K <> "") * ROW(C2:K)))
)
इसलिए, हमारे द्वारा उपयोग की जाने वाली डेटा रेंज से खाली पंक्तियों को फ़िल्टर करने के लिए, FILTER
जो यह जाँच करेगा कि क्या कोई पंक्ति ऊपर से हमारे सरणी में है और यदि उस स्थिति में है तो छोड़ दें:
=ARRAYFORMULA(
FILTER(
C2:K*1,
MATCH(
ROW(C2:K),
UNIQUE(FLATTEN((C2:K <> "") * ROW(C2:K))),
0
)
)
)
चरण 2 - खाली कॉलमों को फ़िल्टर करें
केवल गैर-रिक्त कॉलम संख्याओं की एक सरणी प्राप्त करने के लिए हम लगभग एक ही सूत्र का उपयोग कर सकते हैं:
=ARRAYFORMULA(
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2))))
)
अंत में विवरण देखने के SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2))
बजाय क्यों उपयोग किया जाता है COLUMN(C2:K)
।
खाली कॉलम को फ़िल्टर करने के लिए हम अपने एरे में कॉलम नंबर खोजने के लिए शर्त के FILTER
साथ भी उपयोग करते MATCH
हैं:
=ARRAYFORMULA(
FILTER(
C2:K*1,
MATCH(
SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)),
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
0
)
)
)
और खाली पंक्तियों और खाली कॉलमों को छानने के लिए हम सिर्फ दो FILTER
एस का उपयोग करते हैं :
=ARRAYFORMULA(
FILTER(
FILTER(
C2:K*1,
MATCH(
ROW(C2:K),
UNIQUE(FLATTEN((C2:K <> "") * ROW(C2:K))),
0
)
),
MATCH(
SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)),
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
0
)
)
)
मूल डेटा रेंज आंतरिक रूप से बन जाएगी:
चरण 3 - करो MMULT
अब हम MMULT
औसत की गणना करने के लिए उस डेटा सेट का उपयोग कर सकते हैं :
=ARRAYFORMULA(
MMULT(
FILTER(
FILTER(
C2:K*1,
MATCH(
ROW(C2:K),
UNIQUE(FLATTEN((C2:K <> "") * ROW(C2:K))),
0
)
),
MATCH(
SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)),
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
0
)
),
SEQUENCE(
ROWS(
QUERY(
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
"WHERE Col1 <> 0"
)
),
1,
1,
0
)
) /
MMULT(
FILTER(
FILTER(
(C2:K <> "")*1,
MATCH(
ROW(C2:K),
UNIQUE(FLATTEN((C2:K <> "") * ROW(C2:K))),
0
)
),
MATCH(
SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)),
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
0
)
),
SEQUENCE(
ROWS(
QUERY(
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
"WHERE Col1 <> 0"
)
),
1,
1,
0
)
)
)
यह मूल डेटा पंक्तियों के संबंध में थोड़ा हटकर है।
चरण 4 - AVERAGE कॉलम भरें
मूल डेटा पंक्तियों के अनुरूप औसत बनाने के लिए हम VLOOKUP
इस तरह का उपयोग कर सकते हैं :
=ARRAYFORMULA(
IFNA(VLOOKUP(
SEQUENCE(MAX((C2:K <> "") * ROW(C2:K)) - 1, 1, ROW(C2)),
{
QUERY(UNIQUE(FLATTEN((C2:K <> "") * ROW(C2:K))), "WHERE Col1 <> 0"),
MMULT(
...
) /
MMULT(
...
)
},
2,
0
))
)
कहा पे
SEQUENCE(MAX((C2:K <> "") * ROW(C2:K)) - 1, 1, ROW(C2))
पंक्ति संख्या की एक सरणी है जो 2 से एक से अंतिम-खाली एक नहीं है। हम खाली तारों के साथ सभी पंक्तियों को नहीं भरेंगे।QUERY(UNIQUE(FLATTEN((C2:K <> "") * ROW(C2:K))), "WHERE Col1 <> 0")
0
खोज के लिए कुंजी के रूप में उपयोग किए गए फ़िल्टर किए गए गैर-रिक्त पंक्ति संख्याओं की एक सरणी है ।IFNA
एक खाली स्ट्रिंग को एक खाली डेटा पंक्ति के साथ डालने के लिए वापस करेगा।
अंतिम फार्मूला
यह सब एक साथ डालें:
=ARRAYFORMULA(
IFNA(VLOOKUP(
SEQUENCE(MAX((C2:K <> "") * ROW(C2:K)) - 1, 1, ROW(C2)),
{
QUERY(UNIQUE(FLATTEN((C2:K <> "") * ROW(C2:K))), "WHERE Col1 <> 0"),
MMULT(
FILTER(
FILTER(
C2:K*1,
MATCH(
ROW(C2:K),
UNIQUE(FLATTEN((C2:K <> "") * ROW(C2:K))),
0
)
),
MATCH(
SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)),
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
0
)
),
SEQUENCE(
ROWS(
QUERY(
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
"WHERE Col1 <> 0"
)
),
1,
1,
0
)
) /
MMULT(
FILTER(
FILTER(
(C2:K <> "")*1,
MATCH(
ROW(C2:K),
UNIQUE(FLATTEN((C2:K <> "") * ROW(C2:K))),
0
)
),
MATCH(
SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)),
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
0
)
),
SEQUENCE(
ROWS(
QUERY(
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
"WHERE Col1 <> 0"
)
),
1,
1,
0
)
)
},
2,
0
))
)
कुछ विवरण
INDEX
के बजाय इस्तेमाल किया जा सकताARRAYFORMULA
संक्षिप्तता के लिए (धन्यवाद @ player0, मुझे सिखाया है कि कुछ महीने पहले), लेकिन मुझे के unambiguity की तरहARRAYFORMULA
।- मैं स्पष्टता के लिए,
SEQUENCE
कॉलम या पंक्ति की पंक्ति का1
उपयोग स्पष्ट करने के लिए करता हूं । उदाहरण के लिए, यह एक
SEQUENCE(
ROWS(
QUERY(
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
"WHERE Col1 <> 0"
)
),
1,
1,
0
)
के साथ प्रतिस्थापित किया जा सकता है
SIGN(
QUERY(
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
"WHERE Col1 <> 0"
)
)
जो थोड़ा छोटा है। एक तरीका यह भी है कि यहां @ खिलाडियों को शक्ति प्रदान करने के लिए 0
:
QUERY(
UNIQUE(FLATTEN((C2:K <> "") * SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2)))),
"WHERE Col1 <> 0"
)^0
लेकिन (यह सिर्फ मेरी अटकलें हैं) मुझे लगता है कि SEQUENCE
आंतरिक कार्यान्वयन सरल होना चाहिए फिर एक शक्ति को बढ़ाने का संचालन।
- मैं रेंज का उपयोग करता हूं
C2:K
जो कि शीट पर वास्तव में मौजूद होने की तुलना में एक कॉलम अधिक है। न केवल यह सभी स्तंभों के दाईं ओरC2
और सभी पंक्तियों की एक सीमा देता है , बल्कि यह शीट के दाईं ओर एक और कॉलम जोड़ने के मामले में भी अपडेट करता है: एक डेमो । हालांकि इसे उजागर नहीं किया जाता है। यहC2:K
लगभग पूरी तरह से हो सकता है (अगरZZZ
शीट पर वास्तव में कॉलम मौजूद है, तो उन समस्याओं की जगह लेने में समस्या होगी :
INDIRECT("C2:" & ROWS(C:C))
OFFSET(C2,,, ROWS(C2:C), COLUMNS(C2:2))
- उपयोग करने में एक छोटी खामी है
C2:K
:=ARRAYFORMULA(COLUMN(C2:K))
गैर-मौजूदा वाले के लिए भी कॉलम संख्याओं की एक सरणी लौटाएगा, इसलिए हमें=SEQUENCE(1, COLUMNS(C2:K), COLUMN(C2))
इसके बजाय उपयोग करने की आवश्यकता है ।
मुझे लगता है कि पंक्ति-वार औसत उपयोग करने के लिए एक सरल उत्तर है VLOOKUP
और QUERY
।
यह एक में है B2
:
=ARRAYFORMULA(
IFNA(
VLOOKUP(
ROW(B2:B),
QUERY(
{
FLATTEN(ROW(C2:J) + SEQUENCE(1, COLUMNS(C2:J),,)),
FLATTEN(C2:J)
},
"SELECT Col1, AVG(Col2)
WHERE Col2 IS NOT NULL
GROUP BY Col1"
),
2,
0
)
)
)
- इसे अधिकतम, न्यूनतम, सम, काउंट के लिए आसानी से बदला जा सकता है - केवल
QUERY
कथन के अंदर एकत्रीकरण फ़ंक्शन को बदलें । - स्तंभ-वार एकत्रीकरण के लिए समान दृष्टिकोण का उपयोग किया जा सकता है।
FLATTEN(C2:J)
इसे बदला जा सकता है:FLATTEN(--C2:J)
खाली कोशिकाओं के इलाज के लिए0
;FLATTEN(IFERROR(1/(1/C2:J)))
0
औसत से बाहर करने के लिए ।
- यदि कोई मध्यवर्ती रिक्त पंक्तियाँ नहीं हैं,
VLOOKUP
तो सूत्र से, साथ ही कथनCol1
से हटाया जा सकता हैSELECT
। - एक छोटा संस्करण है (धन्यवाद @MattKing!) बिना
VLOOKUP
औरWHERE Col...
:
=ARRAYFORMULA(
QUERY(
{
FLATTEN(ROW(C2:J) + SEQUENCE(1, COLUMNS(C2:J),,)),
FLATTEN(IFERROR(1/(1/C2:J)))
},
"SELECT AVG(Col2)
GROUP BY Col1
LABEL AVG(Col2) ''"
)
)
मैं उस C2:J
सीमा तक कॉलम का उपयोग करता हूं I:I
, जिस पर कुछ विवरण:
- रेंज
C2:J
जो कि एक से अधिक स्तंभ है वास्तव में शीट पर मौजूद है। न केवल यह सभी स्तंभों के दाईं ओरC2
और सभी पंक्तियों की एक सीमा देता है , बल्कि यह शीट के दाईं ओर एक और कॉलम जोड़ने के मामले में भी अपडेट करता है: एक डेमो । हालांकि इसे उजागर नहीं किया जाता है। यहC2:J
लगभग पूरी तरह से हो सकता है (अगरZZZ
शीट पर वास्तव में कॉलम मौजूद है, तो उन समस्याओं की जगह लेने में समस्या होगी :
INDIRECT("C2:" & ROWS(C:C))
OFFSET(C2,,, ROWS(C2:C), COLUMNS(C2:2))
- उपयोग करने में एक छोटी सी खामी है
C2:J
:=ARRAYFORMULA(0 * COLUMN(C2:J))
गैर-मौजूदा वाले (द्वारा गुणा0
) के लिए भी कॉलम संख्या की एक सरणी लौटाएगा , इसलिए हमें=SEQUENCE(1, COLUMNS(C2:J),,)
इसके बजाय उपयोग करने की आवश्यकता है ।
@ खिलाड़ी 0, इस पर कोई विचार?