Câu trả lời:
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()và 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ó ở đó.
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)))
NAtiện ích giống như R trong gói NumPy tuyệt vời của Python .)
NAs khỏi một vectơ NAs, bạn sẽ mong đợi một vectơ trống, không-.
?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)]
na.omitcũng có một phương pháp dataframe, vì vậy tổng quát hơn.
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.
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.
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
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
purrr:discard
-Infcho mộtdtrong tất cả các NA.