आप चाहते हैं कि सटीक नेस्टेड ऑब्जेक्ट बनाने के लिए, हम शुद्ध जावास्क्रिप्ट के मिश्रण और एक डी 3 नाम का उपयोग करेंगे d3.stratify
। हालाँकि, ध्यान रखें कि 7 मिलियन पंक्तियाँ (कृपया नीचे पोस्ट स्क्रिप्ट देखें) गणना करने के लिए बहुत कुछ है।
यह उल्लेख करना बहुत महत्वपूर्ण है कि, इस प्रस्तावित समाधान के लिए, आपको विभिन्न डेटा सरणियों (उदाहरण के लिए, उपयोग करके ) में राज्यों को अलग करना होगा Array.prototype.filter
। यह प्रतिबंध इसलिए होता है क्योंकि हमें रूट नोड की आवश्यकता होती है, और लिनैनायन टैक्सोनॉमी में राज्यों के बीच कोई संबंध नहीं है (जब तक कि आप "डोमेन" को एक शीर्ष रैंक के रूप में नहीं बनाते हैं , जो सभी यूकेरियोट्स के लिए मूल होगा, लेकिन तब आपके पास एक ही होगा। आर्किया और बैक्टीरिया के लिए समस्या)।
तो, मान लीजिए कि आपके पास यह CSV है (मैंने कुछ और पंक्तियाँ जोड़ दी हैं)
RecordID,kingdom,phylum,class,order,family,genus,species
1,Animalia,Chordata,Mammalia,Primates,Hominidae,Homo,Homo sapiens
2,Animalia,Chordata,Mammalia,Carnivora,Canidae,Canis,Canis latrans
3,Animalia,Chordata,Mammalia,Cetacea,Delphinidae,Tursiops,Tursiops truncatus
1,Animalia,Chordata,Mammalia,Primates,Hominidae,Pan,Pan paniscus
उस CSV के आधार पर, हम यहां एक सरणी बनाएंगे जिसका नाम है tableOfRelationships
, जैसा कि नाम से पता चलता है, रैंकों के बीच संबंध हैं:
const data = d3.csvParse(csv);
const taxonomicRanks = data.columns.filter(d => d !== "RecordID");
const tableOfRelationships = [];
data.forEach(row => {
taxonomicRanks.forEach((d, i) => {
if (!tableOfRelationships.find(e => e.name === row[d])) tableOfRelationships.push({
name: row[d],
parent: row[taxonomicRanks[i - 1]] || null
})
})
});
उपरोक्त डेटा के लिए, यह है tableOfRelationships
:
+---------+----------------------+---------------+
| (Index) | name | parent |
+---------+----------------------+---------------+
| 0 | "Animalia" | null |
| 1 | "Chordata" | "Animalia" |
| 2 | "Mammalia" | "Chordata" |
| 3 | "Primates" | "Mammalia" |
| 4 | "Hominidae" | "Primates" |
| 5 | "Homo" | "Hominidae" |
| 6 | "Homo sapiens" | "Homo" |
| 7 | "Carnivora" | "Mammalia" |
| 8 | "Canidae" | "Carnivora" |
| 9 | "Canis" | "Canidae" |
| 10 | "Canis latrans" | "Canis" |
| 11 | "Cetacea" | "Mammalia" |
| 12 | "Delphinidae" | "Cetacea" |
| 13 | "Tursiops" | "Delphinidae" |
| 14 | "Tursiops truncatus" | "Tursiops" |
| 15 | "Pan" | "Hominidae" |
| 16 | "Pan paniscus" | "Pan" |
+---------+----------------------+---------------+
null
के माता-पिता के रूप में एक नज़र रखें Animalia
: इसीलिए मैंने आपको बताया कि आपको अपने डेटासेट को राज्यों द्वारा अलग करने की आवश्यकता है, null
पूरी तालिका में केवल एक ही मूल्य हो सकता है ।
अंत में, उस तालिका के आधार पर, हम उपयोग करके पदानुक्रम बनाते हैं d3.stratify()
:
const stratify = d3.stratify()
.id(function(d) { return d.name; })
.parentId(function(d) { return d.parent; });
const hierarchicalData = stratify(tableOfRelationships);
और यहाँ डेमो है। अपने ब्राउज़र का कंसोल खोलें (स्निपेट इस कार्य के लिए बहुत अच्छा नहीं है) और children
ऑब्जेक्ट के कई स्तरों ( ) का निरीक्षण करें :
const csv = `RecordID,kingdom,phylum,class,order,family,genus,species
1,Animalia,Chordata,Mammalia,Primates,Hominidae,Homo,Homo sapiens
2,Animalia,Chordata,Mammalia,Carnivora,Canidae,Canis,Canis latrans
3,Animalia,Chordata,Mammalia,Cetacea,Delphinidae,Tursiops,Tursiops truncatus
1,Animalia,Chordata,Mammalia,Primates,Hominidae,Pan,Pan paniscus`;
const data = d3.csvParse(csv);
const taxonomicRanks = data.columns.filter(d => d !== "RecordID");
const tableOfRelationships = [];
data.forEach(row => {
taxonomicRanks.forEach((d, i) => {
if (!tableOfRelationships.find(e => e.name === row[d])) tableOfRelationships.push({
name: row[d],
parent: row[taxonomicRanks[i - 1]] || null
})
})
});
const stratify = d3.stratify()
.id(function(d) {
return d.name;
})
.parentId(function(d) {
return d.parent;
});
const hierarchicalData = stratify(tableOfRelationships);
console.log(hierarchicalData);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
पुनश्च : मुझे नहीं पता कि आप किस प्रकार का डेटाविज़ बनाएंगे, लेकिन आपको वास्तव में टैक्सोनोमिक रैंक से बचना चाहिए। संपूर्ण लिनैयोन टैक्सोनॉमी पुरानी है, हम अब रैंक का उपयोग नहीं करते हैं: चूंकि 60 के दशक के मध्य में फाइटोलैनेटिक सिस्टमैटिक्स विकसित किया गया था, हम बिना किसी टैक्सोनोमिक रैंक (यहां विकासवादी जीव विज्ञान शिक्षक) के बिना केवल टैक्स का उपयोग करते हैं। इसके अलावा, मैं इन 7 मिलियन पंक्तियों के बारे में काफी उत्सुक हूं, क्योंकि हमने केवल 1 मिलियन से अधिक प्रजातियों का वर्णन किया है!
nan
Phylum के लिए Magnoliopsida युक्त देखा । वह क्या हैnan
? फाइलम एंथोफाइटा है, या वैकल्पिक रूप से मैगनोलिया (यह पुरानी फाइलम एंजियोस्पर्मे है)।