2011-08-02 27 views
9

Ben edindiği bir matris benim NA değerleri değiştirmek istiyor demektir.satırla NA değerlerini değiştirin

yani, tablonun şu sıra:

1 2 1 NA 2 1 1 2 

1 2 1 1.43 2 1 2 

teşekkür ederiz olacaktı.

+2

Bunu neden yapmak istersiniz * row-wise *? Sadece kontrol etmek değişkenleri objeler/örnekler ile karıştırmıyor. Genellikle, bu sütun-bilge, her bir değişkenin ortalamasını hesaplar ve bu değişkeni 'NA'nın değişkeni ile değiştirmek için kullanır. –

+0

Ayrıca, read.table() 'bir data.frame döndürür. Bir veri çerçevesi veya uygun bir matris hakkında mı konuşuyorsunuz? –

+0

@GavinSimpson Bunun bir nedeni, bir ölçümde kullanımla ilgili tekrarlanan soruları içeren anket verileri olacaktır. Diğer soruların araçları eksik verileri değiştirmek için kullanılacaktır. – Irwin

cevap

5
x[is.na(x)] <- mean(x, na.rm=TRUE) # for vectors or for a matrix as a whole 

t(apply(x, 1, function(xv) { xv[is.na(xv)] <- 
            mean(xv, na.rm=TRUE) 
           return(xv)} 
     )) # for a row-oriented sol'n 
+3

Bu, tüm matrisin ortalamasını döndürmez mi? –

+0

Olur. Ben o bir satır odaklı çözüm istedim alamadım ama bir tane koyacağız. –

1
a = c(NA, 1, 2, 3, 10) 
a[which(is.na(a)==TRUE)] = mean(a,na.rm = T) 
+2

Bu işe yaramalı, ancak gereksiz yere karmaşık. is.na (a) Boole'lerin bir vektörünü döndürür, bu nedenle == TRUE gereksizdir. "hangisi" gerekli değildir, çünkü vektörleri ya bir uzunluk vektörü <= uzunluk (a) ile ya da "uzunluk (a)" uzunluğundaki bir DOĞRU ve YANLIŞlar içeren bir vektörle (veya 0/1 TRUE/FALSE öğesine zorlandı). Son olarak, T ve F'yi TRUE ve FALSE için kullanmaktan kaçının, çünkü bunların üzerine yazabilirler. –

+0

Daha fazlasını düşündüğüm antrenman yönü: d – user702846

+0

Bir matris için aynı problem, her şeyin ortalamasını alır ve yerini alır. –

21

İşte bazı örnek verileri bu.

m <- matrix(1:16, nrow=4) 
m[c(1,4,6,11,16)] <- NA 

Ve işte, satır anlamında eksikleri nasıl dolduracağım.

k <- which(is.na(m), arr.ind=TRUE) 
m[k] <- rowMeans(m, na.rm=TRUE)[k[,1]] 

Verileriniz data.frame; as.matrix'u kullanarak bir matrise dönüşmeniz gerekecek. Bu formatta bırakmak isteyebilirsiniz ya da olmayabilir; geri kullanımı as.data.frame dönüştürmek.

+1

+1 Bu bilet – joran

+0

Teşekkür ederiz. Kodunuzu kullanarak aşağıdaki hata iletisini alıyorum: Hata [[-. Data.frame' ('* tmp *', k, value = c (3.67857142857143, 3.34375,: yalnızca mantıksal matris aboneliklerine izin verilir – Delphine

+1

Veri çerçevenizi önce bir matrise ('as.matrix') yapın, sonra yapın ve sonra geri dönün (' as.data.frame'). – Aaron

İlgili konular