Yanıtlar:
Denediğinizde ?max
, bunun aslında na.rm =
varsayılan olarak ayarlanmış bir argümanı olduğunu görürsünüz FALSE
. (Yani dahil birçok diğer R fonksiyonları, ortak varsayılan var sum()
, mean()
vs.)
Ayar na.rm=TRUE
tam olarak ne istediğinizi yapar:
d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)
Tüm NA
s'leri kaldırmak istiyorsanız , bunun yerine bu deyimi kullanın:
d <- d[!is.na(d)]
Son bir not: Diğer işlevler (örn table()
. lm()
, Ve sort()
) NA
farklı adlar kullanan ve farklı seçenekler sunan ilgili bağımsız değişkenlere sahiptir. Eğer NA
bir işlev çağrısında size sorun çıkarırsa , işlevin argümanları arasında yerleşik bir çözüm olup olmadığını kontrol etmeye değer. Genellikle orada bir tane buldum .
max()
davrandığıyla ilgilidir (örneğin, yaparken max(c(NA, NA)
). Şahsen, davranışının makul olduğunu düşünüyorum; Bu şekilde inşa edilmesini bekliyorum, böylece böyle şeyler yaparken beklenen sonucu elde edersiniza <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
NA
NA
vektörleri NA
s vektöründen kaldırdığınızda , boş bir vektör beklersiniz, -∞ değil.
?max
, na.rm
ayarlayabileceğiniz fazladan bir parametre olduğunu gösterir TRUE
.
Bunun dışında, gerçektenNA
s kaldırmak istiyorsanız , sadece şöyle bir şey kullanın:
myvec[!is.na(myvec)]
na.omit
bir veri çerçevesi yöntemi vardır, bu yüzden daha geneldir.
Arayabilirsiniz max(vector, na.rm = TRUE)
. Daha genel olarak, na.omit()
işlevi kullanabilirsiniz .
R'de yeni olan birinin orijinal soruya basitleştirilmiş bir cevap istemesi durumunda
NA değerlerini bir vektörden nasıl kaldırabilirim?
İşte burada:
Aşağıdaki gibi bir vektörünüz olduğunu varsayalım foo
:
foo = c(1:10, NA, 20:30)
koşu length(foo)
22 verir.
nona_foo = foo[!is.na(foo)]
length(nona_foo)
NA değerleri kaldırıldığı için 21'dir.
Unutmayın is.na(foo)
, bir boole matrisi döndürür, bu nedenle foo
bu değerin tersiyle indeksleme size NA olmayan tüm öğeleri verecektir.
Kullanım discard
gelen purrr (listeleri ve vektörler ile çalışır).
discard(v, is.na)
Bunun yararı, boruların kullanımının kolay olmasıdır; alternatif olarak yerleşik alt ayar işlevini kullanın [
:
v %>% discard(is.na)
v %>% `[`(!is.na(.))
na.omit
Listelerde çalışmadığını unutmayın :
> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1
$b
[1] 2
$c
[1] NA
İki base
yaklaşımı karşılaştırarak hızlı bir kıyaslama yaptım ve x[!is.na(x)]
daha hızlı olduğu ortaya çıktı na.omit
. Kullanıcı qwr
ben de denemek önerdi purrr::dicard
- bu büyük ölçüde yavaş olduğu ortaya çıktı (gerçi mutlu benim uygulama ve test hakkında yorum alacağım!)
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
Referans için, orijinal x[!is.na(x)]
vs testi 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
bir içind
tüm ilgi UA.