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=TRUE
thự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 NA
s, 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ó NA
cá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 NA
bạ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)))
NA
tiện ích giống như R trong gói NumPy tuyệt vời của Python .)
NA
s khỏi một vectơ NA
s, bạn sẽ mong đợi một vectơ trống, không-.
?max
cho bạn thấy rằng có một tham số phụ na.rm
mà bạn có thể đặt thành TRUE
.
Ngoài ra, nếu bạn thực sự muốn xóa NA
s, chỉ cần sử dụng một cái gì đó như:
myvec[!is.na(myvec)]
na.omit
cũ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ơ foo
như 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 foo
vớ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 discard
từ 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.omit
khô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 base
cá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::dicard
cũ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
-Inf
cho mộtd
trong tất cả các NA.