2010-02-15 37 views
8

Tôi có một hàng dữ liệu 114 hàng theo cột 16, trong đó các hàng là các cá nhân và các cột là tên hoặc NA của chúng. Ví dụ, 3 hàng đầu tiên trông như thế này:Xử lý các giá trị NA trong áp dụng và duy nhất

  name name.1  name.2 name.3  name.4 name.5  name.6 name.7  name.8 name.9  name.10 name.11  name.12 name.13  name.14 name.15 
1   <NA> <NA>  <NA> <NA>   <NA> <NA>   <NA> <NA>   <NA> <NA>  Aanestad <NA>  Aanestad <NA>  Aanestad <NA> 
2   <NA> <NA>  <NA> <NA>   <NA> <NA>   <NA> <NA>  Ackerman <NA>  Ackerman <NA>  Ackerman <NA>  Ackerman <NA> 
3   <NA> <NA>  <NA> <NA>   <NA> <NA>  Alarcon <NA>  Alarcon <NA>  Alarcon <NA>  Alarcon <NA>   <NA> <NA> 

Tôi muốn tạo ra một danh sách (nếu có nhiều tên duy nhất cho mỗi hàng) hoặc vector (nếu chỉ có một tên duy nhất mỗi hàng) của tất cả các tên độc đáo, với chiều dài 114.

Khi tôi thử apply(x,1,unique) Tôi nhận được một mảng 2xNcol đôi khi ô đầu tiên là NA và đôi khi ô thứ hai là NA.

[,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7] [,8] [,9]  
[1,] NA   NA   NA  NA  "Alquist" NA  "Ayala" NA  NA  
[2,] "Aanestad" "Ackerman" "Alarcon" "Alpert" NA  "Ashburn" NA  "Baca" "Battin" 

Khi những gì tôi muốn chỉ là:

Aanestad 
Ackerman 
Alarcon 
... 

tôi dường như không thể tìm ra cách để áp dụng duy nhất() trong khi bỏ qua NA. na.rm, na.omit vv dường như không hoạt động. Tôi cảm thấy như tôi đang thiếu một cái gì đó thực sự đơn giản ...

Cảm ơn!

Trả lời

18

unique không xuất hiện để có một cuộc tranh cãi na.rm, nhưng bạn có thể loại bỏ các giá trị bị mất chính mình trước khi gọi nó:

A <- matrix(c(NA,"A","A", 
      "B", NA, NA, 
       NA, NA, "C"), nr=3, byrow=TRUE) 
apply(A, 1, function(x)unique(x[!is.na(x)])) 

cho

[1] "A" "B" "C" 
+0

Ahh ... làm việc này! Cảm ơn! – bshor

8

Bạn đã rất, rất gần trong ban đầu của bạn dung dịch. Nhưng như Aniko đã nhận xét, bạn không nên xóa các giá trị NA trước khi bạn có thể sử dụng duy nhất.

Một ví dụ mà chúng tôi đầu tiên tạo ra một tương tự data.frame và sau đó sử dụng apply() như bạn đã làm - nhưng với một chức năng ẩn danh khác mà được sử dụng để kết hợp na.omit()unique():

R> DF <- t(data.frame(foo=sample(c(NA, "Foo"), 5, TRUE), 
         bar=sample(c(NA, "Bar"), 5, TRUE))) 
R> DF 
    [,1] [,2] [,3] [,4] [,5] 
foo "Foo" NA "Foo" "Foo" "Foo" 
bar NA NA NA "Bar" "Bar" 
R> apply(DF, 1, function(x) unique(na.omit(x))) 
    foo bar 
"Foo" "Bar" 
+0

Điều này cũng rất tuyệt. Cảm ơn, Dirk (đi Chicago R người dùng!) – bshor

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