NA değerlerini bir vektörden kaldırma


191

Birkaç NAdeğer olan büyük bir vektör var ve ben bu vektör (vektör tüm sayılar) maksimum değeri bulmaya çalışıyorum, ama NAdeğerler nedeniyle bunu yapamam .

NAMaksimum değeri hesaplayabilmem için değerleri nasıl kaldırabilirim ?

Yanıtlar:


265

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=TRUEtam olarak ne istediğinizi yapar:

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

Tüm NAs'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()) NAfarklı adlar kullanan ve farklı seçenekler sunan ilgili bağımsız değişkenlere sahiptir. Eğer NAbir 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 .


Bu çok kötü bir fikir. Bu başarısız olur ve verir -Infbir için dtüm ilgi UA.
user3932000

@ user3932000 Sadece diğerleri için açık olmak gerekirse, şikayetiniz gerçekten temel R işlevinin nasıl 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)))
Josh O'Brien

@ user3932000 Biraz teğetsel olarak, R'nin bir veri analiz platformu olarak güçlü yanlarından biri, yazarlarının çok dikkatli düşünmesinin bir sonucu olarak, eksik verilerin karmaşık bir şekilde ele alınmasıdır . (Konuyla ilgileniyorsanız, Python'un mükemmel NumPy paketine R benzeri işleme tesislerini dahil etmekle uğraşan programcılar açısından ilgili bazı sorunların iyi bir tartışması için buraya bakın .)NA
Josh O'Brien

@ user3932000: Bu cevap gerçekten kötü mü? Sıfır kümesinin maksimum değerini ne düşünürdünüz?
Cliff AB

@CliffAB Maksimum değildir. Maks. -∞ (ve min + +) olacak şekilde atayabilirsiniz, ancak bu her zaman istenen veya sezgisel değildir. Ayrıca, tüm NAvektörleri NAs vektöründen kaldırdığınızda , boş bir vektör beklersiniz, -∞ değil.
user3932000

94

na.omitFonksiyon regresyon rutinleri bir sürü dahili olarak kullanmak budur:

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

20

?max, na.rmayarlayabileceğ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)]

3
Bence bu en iyisi. na.rm ve na.omit çıktıya oldukça fazla önemsiz ekler.
MadmanLee

Dışında na.omitbir veri çerçevesi yöntemi vardır, bu yüzden daha geneldir.
IRTFM

15

Arayabilirsiniz max(vector, na.rm = TRUE). Daha genel olarak, na.omit()işlevi kullanabilirsiniz .


14

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 foobu değerin tersiyle indeksleme size NA olmayan tüm öğeleri verecektir.


13

Kullanım discardgelen 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.omitListelerde ç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

2

İki baseyaklaşı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ı qwrben 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

denemelisinpurrr:discard
qwr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.