กำหนดจำนวนของค่า NA ในคอลัมน์


143

ฉันต้องการนับจำนวนNAค่าในคอลัมน์ data frame กล่าวว่ากรอบข้อมูลของฉันเรียกว่าและชื่อของคอลัมน์ฉันกำลังพิจารณาคือdf colวิธีที่ฉันคิดขึ้นมีดังต่อไปนี้:

sapply(df$col, function(x) sum(length(which(is.na(x)))))  

นี่เป็นวิธีที่ดี / มีประสิทธิภาพมากที่สุดในการทำเช่นนี้?

คำตอบ:


316

คุณคิดถึงปัญหามากเกินไป:

sum(is.na(df$col))

ขอบคุณสำหรับสิ่งนี้. ในการขยายนี้เล็กน้อย ในการนับจำนวนตามอำเภอใจvalueอื่น ๆ นอกเหนือจากNAการเขียนฟังก์ชั่นบูลีน is.valueแล้วใช้sum(is.value(df$col))วิธีที่จะไปหรือมีไวยากรณ์โดยตรงที่กระชับมากขึ้นสำหรับเรื่องนี้?
user3274289

3
เร็วเกินไปที่จะถาม sum(df$col==value,na.rm=FALSE)ไม่หลอกลวง
user3274289

4
@ user3274289: แม้ว่าคุณมักจะต้องการna.rm=TRUEเพราะมิฉะนั้นถ้าdf$colมี NAS, จะกลับมาsum NA
jbaums

1
บางครั้งฉันคิดว่าฉันคิดมากจนฉันได้คำตอบนี้ ... ก็จริง ...
Rugal

ขออภัย แต่มันใช้ไม่ได้สำหรับฉัน ฉันได้รับคำเตือนนี้ข้อความคำเตือน: ใน is.na (ชื่อ $ wd): is.na () นำไปใช้กับ non- (รายการหรือเวกเตอร์) ประเภท 'NULL' และจำนวนนั้นเป็นศูนย์
เฮอร์แมนทูตรอต

77

หากคุณกำลังมองหาการNAนับสำหรับแต่ละคอลัมน์ใน dataframe แล้ว:

na_count <-sapply(x, function(y) sum(length(which(is.na(y)))))

ควรให้รายการที่มีการนับสำหรับแต่ละคอลัมน์

na_count <- data.frame(na_count)

ควรส่งออกข้อมูลอย่างดีใน dataframe เช่น:

----------------------
| row.names | na_count
------------------------
| column_1  | count

1
หากต้องการรวมชื่อแถวเป็นคอลัมน์ให้เรียกใช้na_count$name<-rownames(na_count)ด้วย
แมตต์

6
na_count <-sapply(x, function(y) sum(is.na(y)))เป็นทางเลือกที่สั้นกว่า
Vincent Bonhomme

1
ไม่ได้ผลสำหรับฉัน :( ต้องเปลี่ยนเป็น: na_count <- ใช้ (x, ฟังก์ชั่น (y) ผลรวม (is.na (y)), MARGIN = 2)
Angel Garcia Campos

ฉันไม่คิดว่าเราต้องใช้ทั้งผลรวมและความยาว (ในการมอบหมาย na_count แรก)? ความยาวควรจะเพียงพอ
Yandle


18

หากคุณต้องการนับจำนวน NA ในดาต้าเฟรมทั้งหมดที่คุณสามารถใช้ได้

sum(is.na(df))

13

ในsummary()เอาต์พุตฟังก์ชั่นนี้ยังนับจำนวนNAs ดังนั้นหนึ่งสามารถใช้ฟังก์ชันนี้หากต้องการผลรวมของNAs ในตัวแปรหลายตัว


2
น่าสังเกตว่าsummaryเอาต์พุตเมื่อใช้กับคอลัมน์เดียวนั้นสามารถใช้งานได้ในขณะที่เอาต์พุตจากเฟรมข้อมูลทั้งหมดเป็นอักขระและจำนวนการแยกนั้นยากที่จะแยกหากคุณต้องการในภายหลัง c(summary(mtcars))ดู
Scriven รวย

9

วิธีที่เป็นระเบียบเพื่อนับจำนวนโมฆะในทุกคอลัมน์ของดาต้าเฟรม:

library(tidyverse)
library(purrr)

df %>%
    map_df(function(x) sum(is.na(x))) %>%
    gather(feature, num_nulls) %>%
    print(n = 100)

3
คุณไม่จำเป็นต้องมี purrr:df %>% summarise_all(funs(sum(is.na(.))))
David Bruce Borenstein

หากคุณขี้เกียจเหมือนฉันคุณสามารถเขียนคำตอบของ @Abi K ในรูปแบบของ purrr ที่สั้นกว่าเช่น: df %>% map_df(~sum(is.na(.)))หรือไม่มี dplyr เป็นmap_df(~sum(is.na(df)))
Agile Bean

7

แบบฟอร์มนี้เปลี่ยนไปจากรูปแบบของ Kevin Ogoros เล็กน้อย:

na_count <-function (x) sapply(x, function(y) sum(is.na(y)))

ส่งกลับนับ NA เป็นอาร์เรย์ int ชื่อ


เพื่อให้ได้ผลลัพธ์ตามรายการ:na_count <-function (x) lapply(x, function(y) sum(is.na(y)))
hute37 37

7

วิธีแก้ปัญหา Tidyverse ที่ง่ายและรวดเร็วในการNAนับจำนวนคอลัมน์ทั้งหมดคือการใช้summarise_all()ซึ่งฉันคิดว่าทำให้อ่านง่ายกว่าการใช้purrrหรือsapply

library(tidyverse)
# Example data
df <- tibble(col1 = c(1, 2, 3, NA), 
             col2 = c(NA, NA, "a", "b"))

df %>% summarise_all(~ sum(is.na(.)))
#> # A tibble: 1 x 2
#>    col1  col2
#>   <int> <int>
#> 1     1     2


3

คำตอบที่ผู้ใช้ตอบถูกต้อง แต่จะบอกจำนวนของค่า NA ในคอลัมน์เฉพาะของกรอบข้อมูลที่คุณส่งผ่านเพื่อรับจำนวนค่า NA สำหรับกรอบข้อมูลทั้งหมดลองทำสิ่งนี้:

apply(<name of dataFrame>, 2<for getting column stats>, function(x) {sum(is.na(x))})

นี่เป็นการหลอกลวง


มีการพิมพ์บางอย่างที่ทำให้รหัสนี้ใช้งานไม่ได้ ลองสิ่งนี้ apply(df, 2, function(x) sum(is.na(x)))
user3495945

3

ฉันอ่านไฟล์ csvจากไดเรกทอรีในเครื่อง รหัสต่อไปนี้ทำงานให้ฉัน

# to get number of which contains na
sum(is.na(df[, c(columnName)]) # to get number of na row

# to get number of which not contains na
sum(!is.na(df[, c(columnName)]) 

#here columnName is your desire column name

2

คล้ายกับคำตอบของ hute37 แต่ใช้purrrแพ็คเกจ ฉันคิดว่าวิธีการที่เป็นระเบียบนี้ง่ายกว่าคำตอบที่เสนอโดย AbiK

library(purrr)
map_dbl(df, ~sum(is.na(.)))

หมายเหตุ: เครื่องหมายตัวหนอน ( ~) สร้างฟังก์ชั่นที่ไม่ระบุชื่อ และ '.' หมายถึงการป้อนข้อมูลสำหรับฟังก์ชั่นที่ไม่ระบุชื่อในกรณีนี้ dfdata.frame



0
sapply(name of the data, function(x) sum(is.na(x)))

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