Xóa giá trị NA khỏi một vectơ


191

Tôi có một vectơ lớn có một vài NAgiá trị và tôi đang cố gắng tìm giá trị tối đa trong vectơ đó (vectơ là tất cả các số), nhưng tôi không thể làm điều này vì các NAgiá trị.

Làm thế nào tôi có thể loại bỏ các NAgiá trị để tôi có thể tính toán tối đa?

Câu trả lời:


264

Hãy thử ?max, bạn sẽ thấy rằng nó thực sự có một na.rm =đối số, được đặt mặc định thành FALSE. (Đó là mặc định chung cho nhiều chức năng R khác, bao gồm sum(), mean(), vv)

Cài đặt na.rm=TRUEthực hiện đúng những gì bạn yêu cầu:

d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)

Nếu bạn muốn xóa tất cả các NAs, thay vào đó hãy sử dụng thành ngữ này:

d <- d[!is.na(d)]

Lưu ý cuối cùng: Các hàm khác (ví dụ table(), lm()sort()) có NAcác đối số liên quan sử dụng các tên khác nhau (và cung cấp các tùy chọn khác nhau). Vì vậy, nếu NAbạn gây ra sự cố trong lệnh gọi hàm, thì đáng để kiểm tra giải pháp tích hợp trong số các đối số của hàm. Tôi đã tìm thấy thường có một cái đã có ở đó.


Đây là một ý kiến ​​tồi. Nó thất bại và cung cấp -Infcho một dtrong tất cả các NA.
dùng3932000

@ user3932000 Chỉ cần rõ ràng cho người khác, khiếu nại của bạn thực sự là về cách chức năng cơ sở R hoạt max()động (ví dụ như khi thực hiện max(c(NA, NA)). Cá nhân, tôi nghĩ rằng hành vi của nó là hợp lý; Tôi hy vọng nó được xây dựng theo cách đó để bạn có được kết quả như mong đợi khi làm những việc nhưa <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
Josh O'Brien

@ user3932000 Hơi tiếp tuyến, là một trong nhiều điểm mạnh R như là một nền tảng phân tích dữ liệu là xử lý phức tạp của dữ liệu bị mất, kết quả của nhiều suy nghĩ cẩn thận về phía tác giả của nó. (Nếu bạn quan tâm đến chủ đề này, hãy xem tại đây để thảo luận tốt về một số vấn đề liên quan, từ quan điểm của các lập trình viên đã tham gia vào việc kết hợp các NAtiện ích giống như R trong gói NumPy tuyệt vời của Python .)
Josh O'Brien

@ user3932000: câu trả lời đó có thực sự tệ không? Bạn sẽ xem xét tối đa của tập hợp null là gì?
Vách đá AB

@CliffAB Nó không có tối đa. Bạn có thể gán giá trị tối đa là -∞ (và tối thiểu là + ∞), nhưng điều đó không phải lúc nào cũng mong muốn hoặc trực quan. Ngoài ra, khi bạn loại bỏ tất cả NAs khỏi một vectơ NAs, bạn sẽ mong đợi một vectơ trống, không-.
dùng3932000

94

Các na.omitchức năng là những gì rất nhiều các thói quen hồi quy sử dụng trong nội bộ:

vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000

20

?maxcho bạn thấy rằng có một tham số phụ na.rmmà bạn có thể đặt thành TRUE.

Ngoài ra, nếu bạn thực sự muốn xóa NAs, chỉ cần sử dụng một cái gì đó như:

myvec[!is.na(myvec)]

3
Tôi nghĩ rằng điều này là tốt nhất. na.rm và na.omit thêm khá nhiều rác vào đầu ra.
MadmanLee

Ngoại trừ na.omitcũng có một phương pháp dataframe, vì vậy tổng quát hơn.
IRTFM

15

Bạn có thể gọi max(vector, na.rm = TRUE). Tổng quát hơn, bạn có thể sử dụng na.omit()chức năng.


14

Chỉ trong trường hợp ai đó mới biết R muốn có câu trả lời đơn giản cho câu hỏi ban đầu

Làm thế nào tôi có thể loại bỏ các giá trị NA từ một vectơ?

Đây là:

Giả sử bạn có một vectơ foonhư sau:

foo = c(1:10, NA, 20:30)

chạy length(foo)cho 22.

nona_foo = foo[!is.na(foo)]

length(nona_foo) là 21, vì các giá trị NA đã bị xóa.

Nhớ is.na(foo)trả về một ma trận boolean, vì vậy việc lập chỉ mục foovới giá trị ngược lại sẽ cung cấp cho bạn tất cả các phần tử không phải là NA.


13

Sử dụng discardtừ purrr (hoạt động với danh sách và vectơ).

discard(v, is.na) 

Lợi ích là dễ sử dụng đường ống; cách khác là sử dụng chức năng tập hợp con tích hợp [:

v %>% discard(is.na)
v %>% `[`(!is.na(.))

Lưu ý rằng na.omitkhông hoạt động trên danh sách:

> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1

$b
[1] 2

$c
[1] NA

1

Tôi đã chạy một điểm chuẩn nhanh so sánh hai basecách tiếp cận và hóa ra x[!is.na(x)]là nhanh hơn na.omit. Người dùng qwrđề nghị tôi purrr::dicardcũng thử - điều này hóa ra là chậm hơn ồ ạt (mặc dù tôi sẽ vui vẻ nhận xét về việc triển khai & kiểm tra của mình!)

microbenchmark::microbenchmark(
  purrr::map(airquality,function(x) {x[!is.na(x)]}), 
  purrr::map(airquality,na.omit),
  purrr::map(airquality, ~purrr::discard(.x, .p = is.na)),
  times = 1e6)

Unit: microseconds
                                                     expr    min     lq      mean median      uq       max neval cld
 purrr::map(airquality, function(x) {     x[!is.na(x)] })   66.8   75.9  130.5643   86.2  131.80  541125.5 1e+06 a  
                          purrr::map(airquality, na.omit)   95.7  107.4  185.5108  129.3  190.50  534795.5 1e+06  b 
  purrr::map(airquality, ~purrr::discard(.x, .p = is.na)) 3391.7 3648.6 5615.8965 4079.7 6486.45 1121975.4 1e+06   c

Để tham khảo, đây là thử nghiệm ban đầu của x[!is.na(x)]vs na.omit:

microbenchmark::microbenchmark(
    purrr::map(airquality,function(x) {x[!is.na(x)]}), 
    purrr::map(airquality,na.omit), 
    times = 1000000)


Unit: microseconds
                                              expr  min   lq      mean median    uq      max neval cld
 map(airquality, function(x) {     x[!is.na(x)] }) 53.0 56.6  86.48231   58.1  64.8 414195.2 1e+06  a 
                          map(airquality, na.omit) 85.3 90.4 134.49964   92.5 104.9 348352.8 1e+06   b

bạn nên thửpurrr:discard
qwr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.