열의 NA 값 수 결정


143

NA데이터 프레임 열의 값 수를 계산하고 싶습니다 . 내 데이터 프레임이 호출 df되고 고려중인 열의 이름 이라고 가정하십시오 col. 내가 생각해 낸 방법은 다음과 같습니다.

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

이것이 가장 좋고 효율적인 방법입니까?

답변:


316

문제를 과도하게 생각하고 있습니다.

sum(is.na(df$col))

감사합니다. 이것을 조금 확장하십시오. 부울 함수를 작성하고 이동하는 방법을 사용 하는 value것 이외 의 임의의 양을 계산할 때 더 간결한 직접 구문이 있습니까? NAis.valuesum(is.value(df$col))
user3274289

3
너무 빨리 물어 보았다. sum(df$col==value,na.rm=FALSE)트릭을 수행합니다.
user3274289

4
@ user3274289 : na.rm=TRUE그렇지 않으면 df$colNA 가 포함되어 있으면를 sum반환 하기 때문에 일반적으로을 원할 것 NA입니다.
jbaums 2016 년

1
때때로 나는이 답변을 얻을 때까지 너무 생각하고 있다고 생각합니다 ... 글쎄, 사실입니다 ...
Rugal

미안하지만 이것은 나를 위해 작동하지 않습니다. 이 경고 메시지가 나타납니다. In is.na (nom $ wd) : is.na ()가 'NULL'유형의 비 (목록 또는 벡터)에 적용되며 개수는 0입니다.
Herman Toothrot

77

NA데이터 프레임에서 각 열의 개수를 찾고 있다면 :

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

각 열의 개수가 포함 된 목록을 제공해야합니다.

na_count <- data.frame(na_count)

다음과 같은 데이터 프레임에서 데이터를 멋지게 출력해야합니다.

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

1
행 이름을 열로 포함하려면을 실행하십시오 na_count$name<-rownames(na_count).
Matt

6
na_count <-sapply(x, function(y) sum(is.na(y)))더 짧은 대안입니다.
Vincent Bonhomme 10

1
나를 위해하지 않았다 작업 :(로 변경했다 : <na_count - 적용 (합계 (is.na (Y)) × 함수 (Y), MARGIN = 2)
엔젤 가르시아 캄포스

우리는 sum과 length 함수를 모두 사용할 필요가 없다고 생각합니다 (첫 번째 na_count 할당에서)? 길이만으로도 충분합니다.
Yandle

39

colSums기능을 사용해보십시오

df <- data.frame(x = c(1,2,NA), y = rep(NA, 3))

colSums(is.na(df))

#x y 
#1 3 

18

전체 데이터 프레임에서 NA 수를 계산하려는 경우 다음을 사용할 수도 있습니다.

sum(is.na(df))

13

에서 summary()출력 기능도 카운트 NA하나의 합이 원한다면 하나가이 기능을 사용할 수 있도록이야 NA여러 변수들.


2
summary단일 열에서 사용될 때 출력을 사용할 수 있지만 전체 데이터 프레임의 출력은 문자이며 나중에 필요할 경우 카운트를 추출하기가 어렵다는 점에 주목할 가치 가 있습니다. 참조하십시오 c(summary(mtcars)).
Rich Scriven

9

데이터 프레임의 모든 열에서 널 수를 계산하는 깔끔한 방법 :

library(tidyverse)
library(purrr)

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

3
당신은 더 필요하지 않습니다 :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

7

의 GET에 빠르고 쉬운 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

사용자 rrs 답변은 맞지만 전체 데이터 프레임의 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(.)))

참고 : 물결표 ( ~)는 익명 함수를 만듭니다. 그리고 '.' 익명 함수의 입력 (이 경우 data.frame)을 참조하십시오 df.



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

" 전적으로 코드 기반 답변 설명 "을 참조하십시오 . 이것은 기술적으로 정확할 수 있지만 왜 문제를 해결하는지 또는 선택된 답이어야하는지 설명하지는 않습니다. 우리는 또한 문제 해결을 돕기 위해 교육해야합니다.
틴 남자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.