Pertanyaan Mengatur ulang matriks: meruntuhkan kolom untuk menghapus NAs


Setelah pencarian yang teliti saya masih tidak bisa menyelesaikan masalah saya, ini dia. Saya memiliki banyak matriks NAseperti ini:

matrix(c(NA,NA,1,NA,NA,-3,  -1,NA,NA,NA,NA,NA,  NA,2,NA,NA,NA,NA,  NA,3,NA,NA,-2,5,  NA,NA,NA,NA,NA,NA,  NA,NA,NA,6,-7,NA),ncol=6,nrow = 6)

yang menghasilkan hal berikut

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]   NA   -1   NA   NA   NA   NA
[2,]   NA   NA    2    3   NA   NA
[3,]    1   NA   NA   NA   NA   NA
[4,]   NA   NA   NA   NA   NA    6
[5,]   NA   NA   NA   -2   NA   -7
[6,]   -3   NA   NA    5   NA   NA

Tujuan saya adalah meruntuhkan matriks untuk memiliki: 1) jumlah baris yang dihasilkan dari menggeser semua nilai ke atas untuk menyingkirkan NAs; 2) jumlah kolom yang sama. Dalam hal ini matriks yang dihasilkan akan menjadi 3X6, karena dalam hal tidak ada lebih dari 3 nilai untuk setiap kolom. Ini adalah matriks yang saya coba dapatkan:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   -1    2    3   NA    6
[2,]   -3   -1    2   -2   NA   -7
[3,]    1   -1    2    5   NA    6

1) kolom dengan nilai tunggal mengulanginya; 2) kolom-kolom dengan dua nilai memiliki nilai kedua untuk kedua kalinya mereka muncul, sementara ketika mereka muncul ketiga, mereka mengasumsikan nilai pertama lagi (dan akhirnya mempertahankannya untuk baris tambahan); 3) kolom dengan tiga nilai mengubahnya setiap waktu. Kolom dengan semua NAs bisa tetap sama.

Solusi yang lengkap akan sangat bagus, tetapi saya baik-baik saja dengan mendapatkan petunjuk tentang cara untuk melanjutkan dengan jenis restrukturisasi yang rumit ini.


4
2018-01-17 20:21


asal


Jawaban:


Berasumsi bahwa m adalah matriks input, temukan jumlah maksimal non-NAs di kolom mana pun dan kemudian terapkan rep_len ke non-NAs di setiap kolom dengan panjang itu:

mx <- max(colSums(!is.na(m)))
apply(m, 2, function(x) rep_len(na.omit(x), mx))

memberi:

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1   -1    2    3   NA    6
[2,]   -3   -1    2   -2   NA   -7
[3,]    1   -1    2    5   NA    6

5
2018-01-17 20:35