Belirli NA sütununu içeren satırları çıkar


130

NABir veri çerçevesindeki değerleri nasıl atlayacağımı bilmek istiyorum , ancak yalnızca ilgilendiğim bazı sütunlarda.

Örneğin,

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))

ancak sadece nerede yolduğu veriyi atlamak istiyorum NA, bu nedenle sonuç

  x  y  z
1 1  0 NA
2 2 10 33

na.omittüm satırları siliyor gibi görünüyor NA.

Biri bana bu basit sorudan kurtulabilir mi?

Ama şimdi soruyu şu şekilde değiştirirsem:

DF <- data.frame(x = c(1, 2, 3,NA), y = c(1,0, 10, NA), z=c(43,NA, 33, NA))

Yalnızca atlamak istersem x=naveya in işlevini z=nanereye koyabilirim |?

Yanıtlar:


79

complete.casesİşlevi kullanabilir ve şu şekilde bir işleve koyabilirsiniz:

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))

completeFun <- function(data, desiredCols) {
  completeVec <- complete.cases(data[, desiredCols])
  return(data[completeVec, ])
}

completeFun(DF, "y")
#   x  y  z
# 1 1  0 NA
# 2 2 10 33

completeFun(DF, c("y", "z"))
#   x  y  z
# 2 2 10 33

DÜZENLEME: Yalnızca NAs içermeyen satırları döndür

Herhangi NAbir sütunda en az bir tane olan tüm satırları kaldırmak istiyorsanız , complete.casesişlevi doğrudan kullanın :

DF[complete.cases(DF), ]
#   x  y  z
# 2 2 10 33

Veya completeFuniş akışınıza zaten yerleşmişse;)

completeFun(DF, names(DF))

Yaklaşımınızı açgözlü yapabilir misiniz? Hiç NA'ya sahip olmayan tüm sütunları alın.
Léo Léopold Hertz 준영

1
Sadece dönmek demek satırları hiçbir ile NAs? Beğen completeFun(DF, names(DF))?
BenBarnes

Doğru! Lütfen cevabınıza eklemeyi düşünün çünkü burada yaygın bir ihtiyaçtır. - - Bence mnel'in cevabı sizinki kadar genişletilemez. İşlev yaklaşımınız harika!
Léo Léopold Hertz 준영

1
Bitti! 준영 LéoLéopoldHertz @ ucu için Thx
Ben Barnes

192

kullanım is.na

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
DF[!is.na(DF$y),]

1
Bu yaklaşımı, veri setindeki tüm sütunlara açgözlülükle nasıl uyguluyorsunuz? Sütun değerlerinden herhangi biri NA ise atlayın. Dolayısıyla, veri kümesi çıktınız yalnızca ikinci sütundur.
Léo Léopold Hertz 준영

2
Kullanım na.omitaçgözlülükle herhangi sütunda NA ile tüm satırları kaldırmakna.omit(DF)
M. Viking

69

Hadley tidyrbu harika işleve kavuştudrop_na

library(tidyr)
DF %>% drop_na(y)
  x  y  z
1 1  0 NA
2 2 10 33

30

"Alt küme" kullanın

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
subset(DF, !is.na(y))

9

Kullanımı mümkündür na.omitiçin data.table:

na.omit(data, cols = c("x", "z"))

3
cols=argüman mevcuttur data.table::na.omitkütüphanede. Üs değil stats::na.omit.
M Viking

3

Bunu dene:

cc=is.na(DF$y)
m=which(cc==c("TRUE"))
DF=DF[-m,]

2

İki belirli sütundan biri içeriyorsa satırı atlayın <NA>.

DF[!is.na(DF$x)&!is.na(DF$z),]

1

Sadece şunu dene:

DF %>% t %>% na.omit %>% t

Veri çerçevesini aktarır ve aktarmadan önce 'sütun' olan boş satırları atlar ve sonra onu geri aktarırsınız.


9
Lütfen neler olduğunu biraz açıklayın.
vonbrand
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.