ละเว้นแถวที่มีคอลัมน์เฉพาะของ NA


129

ฉันต้องการทราบวิธีละเว้นNAค่าในกรอบข้อมูล แต่เฉพาะในบางคอลัมน์ที่ฉันสนใจ

ตัวอย่างเช่น,

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

แต่ฉันต้องการละเว้นข้อมูลที่yเป็นNAดังนั้นผลลัพธ์ควร

  x  y  z
1 1  0 NA
2 2 10 33

na.omitNAดูเหมือนลบแถวทั้งหมดมีการใด ๆ

ใครช่วยฉันออกจากคำถามง่าย ๆ นี้ได้ไหม

แต่ถ้าตอนนี้ฉันเปลี่ยนคำถามเช่น:

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

หากฉันต้องการละเว้นเพียงอย่างเดียวx=naหรือz=naฉันจะใส่|ฟังก์ชันไว้ในตำแหน่งใดได้บ้าง

คำตอบ:


79

คุณสามารถใช้complete.casesฟังก์ชั่นและใส่ลงในฟังก์ชั่นดังนี้:

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

แก้ไข: ส่งคืนแถวเท่านั้นโดยไม่มีNAs

หากคุณต้องการกำจัดแถวทั้งหมดอย่างน้อยหนึ่งNAแถวในคอลัมน์ใด ๆ ให้ใช้complete.casesฟังก์ชันตรงขึ้น:

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

หรือถ้าcompleteFunฝังอยู่ในเวิร์กโฟลว์ของคุณแล้ว)

completeFun(DF, names(DF))

คุณช่วยโลภแนวทางของคุณได้ไหม? ใช้คอลัมน์ทั้งหมดที่ไม่มี NAs เลย
LéoLéopold Hertz 준영

1
คุณหมายถึงแค่คืนแถวที่ไม่มีNAs หรือไม่? ชอบcompleteFun(DF, names(DF))ไหม
BenBarnes

แก้ไข! โปรดพิจารณาเพิ่มลงในคำตอบของคุณเพราะมันเป็นความต้องการทั่วไปที่นี่ - - ฉันคิดว่าคำตอบของ mnel ไม่สามารถขยายได้ตามที่คุณต้องการ ฟังก์ชั่นการใช้งานของคุณยอดเยี่ยมมาก!
LéoLéopold Hertz 준영

1
ทำ! ขอบคุณสำหรับเคล็ดลับ @ LéoLéopoldHertz준영
BenBarnes

192

ใช้ 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
คุณจะใช้วิธีการนี้อย่างตะกละตะกลามในคอลัมน์ทั้งหมดในชุดข้อมูลได้อย่างไร หากค่าของคอลัมน์ใด ๆ คือ NA ข้าม ดังนั้นเอาต์พุตชุดข้อมูลของคุณจึงเป็นคอลัมน์ที่สองเท่านั้น
LéoLéopold Hertz 준영

2
ใช้na.omitเพื่อลบแถวทั้งหมดด้วย NA ในคอลัมน์ใด ๆna.omit(DF)
M. Viking

69

Hadley tidyrเพิ่งได้รับฟังก์ชั่นที่น่าทึ่งนี้drop_na

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


9

มันเป็นไปได้ที่จะใช้na.omitสำหรับdata.table:

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

3
cols=โต้แย้งที่มีอยู่ในdata.table::na.omitห้องสมุด stats::na.omitไม่ฐาน
M. Viking


2

<NA>แถวละเว้นถ้าทั้งสองคอลัมน์ที่เฉพาะเจาะจงประกอบด้วย

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

1

ลองทำสิ่งนี้:

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

มัน transposes กรอบข้อมูลและละเว้นแถว null ซึ่งเป็น 'คอลัมน์' ก่อนขนย้ายและจากนั้นคุณแปลงกลับ


9
โปรดอธิบายสิ่งที่เกิดขึ้น
vonbrand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.