2011-08-02 30 views
9

Tôi muốn thay thế các giá trị NA của tôi từ một ma trận được mua lại bởi:Thay thế giá trị NA bởi hàng có nghĩa

read.table(…) 

Những giá trị nên giá trị trung bình của hàng tương ứng.

tức là, hàng sau của bảng:

1 2 1 NA 2 1 1 2 

sẽ trở thành

1 2 1 1.43 2 1 2 

Cảm ơn bạn.

+2

Tại sao bạn muốn thực hiện điều này * hàng khôn ngoan *? Chỉ cần kiểm tra bạn không trộn các biến với các đối tượng/mẫu. Thông thường người ta làm theo cột này, tính trung bình cho mỗi biến và sử dụng nó để thay thế 'NA' trong biến. –

+0

Ngoài ra, 'read.table()' trả về một data.frame. Bạn đang nói về một khung dữ liệu hoặc một ma trận thích hợp? –

+0

@GavinSimpson Một lý do cho điều này sẽ là dữ liệu câu hỏi với các câu hỏi lặp đi lặp lại để sử dụng trong một phép đo. Các phương tiện của các câu hỏi khác sẽ được sử dụng để thay thế dữ liệu còn thiếu. – Irwin

Trả lời

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

Điều này sẽ không trả về giá trị trung bình của toàn bộ ma trận? –

+0

Nó sẽ. Tôi đã không nhận được rằng ông muốn có một giải pháp theo định hướng hàng nhưng sẽ đặt một trong. –

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

Điều này sẽ làm việc, nhưng nó không cần thiết phức tạp. is.na (a) trả về một vectơ của Booleans, vì vậy, == TRUE là thừa. 'which' cũng không cần thiết, vì bạn có thể chỉ mục vectơ bằng vector có chiều dài <=' length (a) 'hoặc bởi vectơ có độ dài' length (a) 'chứa TRUEs và FALSEs (hoặc 0/1) bị ép buộc thành TRUE/FALSE). Cuối cùng, tránh sử dụng T và F cho TRUE và FALSE, vì chúng có thể bị ghi đè. –

+0

Tôi xem xét nhiều hơn, khía cạnh đào tạo: d – user702846

+0

Đối với một ma trận, cùng một vấn đề, lấy giá trị trung bình của mọi thứ và thay thế. –

21

Dưới đây là một số dữ liệu mẫu.

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

Và đây là cách tôi điền vào các thông báo lỗi bằng phương tiện hàng.

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

Dữ liệu của bạn sẽ ở trong data.frame; bạn sẽ phải chuyển đổi thành ma trận trước tiên bằng cách sử dụng as.matrix. Bạn có thể hoặc không muốn để nó ở định dạng đó; để chuyển đổi sử dụng trở lại as.data.frame.

+1

+1 Đó là vé. – joran

+0

Cảm ơn bạn. Tôi nhận được thông báo lỗi sau bằng mã của bạn: Lỗi trong '[<-. Data.frame' (' * tmp * ', k, value = c (3.67857142857143, 3.34375,: chỉ các bảng con ma trận logic được phép thay thế – Delphine

+1

Đặt khung dữ liệu của bạn thành ma trận trước ('as.matrix'), sau đó thực hiện, sau đó chuyển đổi lại (' as.data.frame'). – Aaron

Các vấn đề liên quan