Untuk membuat objek bersarang tepat yang Anda inginkan kami akan menggunakan campuran JavaScript murni dan metode D3 bernama d3.stratify
. Namun, ingatlah bahwa 7 juta baris (lihat post scriptum di bawah) banyak yang bisa dihitung.
Sangat penting untuk menyebutkan bahwa, untuk solusi yang diusulkan ini, Anda harus memisahkan Kingdoms dalam array data yang berbeda (misalnya, menggunakan Array.prototype.filter
). Pembatasan ini terjadi karena kita memerlukan simpul root, dan dalam taksonomi Linnaean tidak ada hubungan antara Kerajaan (kecuali jika Anda membuat "Domain" sebagai peringkat teratas, yang akan menjadi root untuk semua eukariota, tetapi kemudian Anda akan memiliki yang sama masalah untuk Archaea dan Bakteri).
Jadi, misalkan Anda memiliki CSV ini (saya menambahkan beberapa baris lagi) hanya dengan satu Kerajaan:
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
Berdasarkan CSV itu, kami akan membuat array di sini bernama tableOfRelationships
yang, seperti namanya, memiliki hubungan antara peringkat:
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
})
})
});
Untuk data di atas, ini adalah 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" |
+---------+----------------------+---------------+
Lihatlah null
sebagai induk dariAnimalia
: itu sebabnya saya katakan bahwa Anda perlu memisahkan dataset Anda dengan Kingdoms, hanya ada satu null
nilai di seluruh tabel.
Akhirnya, berdasarkan tabel itu, kami membuat hierarki menggunakan d3.stratify()
:
const stratify = d3.stratify()
.id(function(d) { return d.name; })
.parentId(function(d) { return d.parent; });
const hierarchicalData = stratify(tableOfRelationships);
Dan ini adalah demo. Buka konsol peramban Anda (snipet tidak terlalu bagus untuk tugas ini) dan periksa beberapa level ( children
) objek:
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>
PS : Saya tidak tahu jenis data apa yang akan Anda buat, tetapi Anda benar-benar harus menghindari peringkat taksonomi. Seluruh taksonomi Linnaean sudah usang, kami tidak menggunakan peringkat lagi: karena sistematika filogenetik dikembangkan pada pertengahan 60-an, kami hanya menggunakan taksa, tanpa peringkat taksonomi (guru biologi evolusi di sini). Juga, saya cukup ingin tahu tentang 7 juta baris ini, karena kami telah menggambarkan lebih dari 1 juta spesies!
nan
untuk sebuah Filum yang mengandung Magnoliopsida. Apa itunan
? Phylum adalah Anthophyta, atau Magnolia (alternatifnya adalah Phylum Angiospermae).