data.frame에서 누락 된 값을보고하는 우아한 방법


80

다음은 데이터 프레임에서 누락 된 값이있는 변수를보고하기 위해 작성한 코드입니다. 이 작업을 수행하는 더 우아한 방법, 아마도 data.frame을 반환하는 방법을 생각하고 있지만 갇혀 있습니다.

for (Var in names(airquality)) {
    missing <- sum(is.na(airquality[,Var]))
    if (missing > 0) {
        print(c(Var,missing))
    }
}

편집 : 저는 수십에서 수백 개의 변수가있는 data.frame을 다루고 있으므로 누락 된 값이있는 변수 만보고하는 것이 중요합니다.


@kohske : 그게 내 첫 생각 이었지만 결과는 table문자 수이므로 NA 수를 구문 분석해야합니다.
Joshua Ulrich

답변을 게시했기 때문에 질문을 되돌립니다. 답변에 대해 의견을 말하고 싶다면 해당 답변에 대한 의견으로 작성하십시오. 질문에도 답변이 포함되어 있으면 매우 혼란스러워집니다.
Andrie 2011

@Andrie : 내가 직면 한 주요 문제는 누락 된 값이있는 변수 만보고하는 것이므로 편집 내용에 동의하지 않습니다. 또한 롤백은 코드에 대한 변경 사항을 제거했습니다. 이 정보를 포함하도록 질문을 편집하고 수정 된 버전의 Josh 코드를 주석에 추가했습니다.
Zach

@Zach 당신의 새로운 편집은 나에게 괜찮아 보인다. 그런데 질문이 명확 해지면 질문에 추가 데이터 / 요청을 추가하는 것을 싫어하지 않습니다.
Andrie 2011

이를 수행하는 방법은 50 만 가지입니다. CRAN 작업보기
-MissingData

답변:


156

그냥 사용 sapply

> sapply(airquality, function(x) sum(is.na(x)))
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0

apply또는 다음 colSums에서 만든 행렬을 사용할 수도 있습니다.is.na()

> apply(is.na(airquality),2,sum)
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0
> colSums(is.na(airquality))
  Ozone Solar.R    Wind    Temp   Month     Day 
     37       7       0       0       0       0 

12
누락 된 값만보고하도록 코드를 약간 수정했습니다.M <- sapply(airquality, function(x) sum(is.na(x))); M[M>0]
Zach

감사! 많이 배웠습니다.
Bombyx mori 2015

안녕하세요 @Joshua Ulrich, 간결한 코드에 감사드립니다. na 값의 백분율을 표시하는 데이터 프레임에 열을 추가하고 싶습니다. 이와 관련하여 도움을 주시겠습니까?
DukeLover

2
@Zach 나는 필수 필드에 값이 있는지 확인하기 위해 귀하의 제안 버전을 사용 :M <- colSums(is.na(airquality)); M[M <= 0]
앤서니 사이먼 Mielniczuk

@Joshua가 % s에 대한 옵션을 추가하는 것도 에이스가 될 것입니다!
radek

8

map_dfpurrr와 함께 사용할 수 있습니다 .

library(mice)
library(purrr)

# map_df with purrr
map_df(airquality, function(x) sum(is.na(x)))
# A tibble: 1 × 6
# Ozone Solar.R  Wind  Temp Month   Day
# <int>   <int> <int> <int> <int> <int>
# 1    37       7     0     0     0     0

1
map_dfover 의 장점은 무엇입니까 sapply?
Zach

1
@Zach 큰 차이는 없다고 생각하지만 Hadley는 함수 내에서 sapply ()를 사용하지 말라고 말했습니다. 예외 및 디버깅 참조 · Advanced R. adv-r.had.co.nz/Exceptions-Debugging.html .
Keiku

저와 같은 게으른 사람들의 경우, 함수 (~)에 대해 더 짧은 purrr 구문으로 위 코드를 작성할 수 있으므로 다음과 같습니다.map_df( air quality, ~sum(is.na(.) )
Agile Bean

1
의 장점 @Zach map_df이상이 sapplymap_df의 출력 형식은 항상 tibble대로 결과가 많은 행이있는 경우에만입니다.
Agile Bean

1
@Zach : (지정한) 알려진 결과 구조를 제공 하므로 함수에서 vapplyvs 를 사용하는 것이 좋습니다 . 함수 출력에 따라 배열 또는 목록을 반환 할 수 있습니다. 의 단점은 입력으로 data.frame을 제공하고 data.frame이 아닌 data.frame 하위 클래스를 반환한다는 것입니다. 미래에 필요한 모든 경우에 tibbles가 data.frame이하는 것처럼 작동한다는 보장은 없습니다. sapplyvapplysapplymap_df
Joshua Ulrich는

8

(너무 넓지 않은) 데이터에 대한 나의 새로운 즐겨 찾기는 우수한 naniar 패키지의 메서드입니다 . 빈도뿐만 아니라 누락 패턴도 얻습니다.

library(naniar)
library(UpSetR)

riskfactors %>%
  as_shadow_upset() %>%
  upset()

여기에 이미지 설명 입력

누락이있는 산점도를 플로팅하여 얻을 수있는 비결 측과 관련하여 누락이 어디에 있는지 확인하는 것이 종종 유용합니다.

ggplot(airquality,
       aes(x = Ozone,
           y = Solar.R)) +
 geom_miss_point()

여기에 이미지 설명 입력

또는 범주 형 변수의 경우 :

gg_miss_fct(x = riskfactors, fct = marital)

여기에 이미지 설명 입력

이러한 예는 다른 흥미로운 시각화를 나열하는 패키지 비 네트 에서 가져온 것 입니다.


2
게시 해 주셔서 감사합니다! 이제 gg_miss_upset()최신 릴리스에 전용 기능이 있으며, 휴일에서 돌아 오면 CRAN에 제출됩니다. naniar.njtierney.com/reference/gg_miss_upset.html
Nick Tierney

6
summary(airquality)

이미이 정보를 제공합니다

VIM의 패키지는 data.frame 데이터 플롯 누락 멋진을 제공합니다

library("VIM")
aggr(airquality)

여기에 이미지 설명 입력


VIM 패키지는 어떤 특정 관측치에 누락 된 데이터가 있는지보고 할 수 있습니까?
Anthony Simon Mielniczuk

그렇게 생각하지 않습니다 ...하지만 당신은 아주 쉽게이를 얻을 수 있습니다 (당신은 당신의 자신의 dataframe에 airquality을 대체 할 것) : 고해상도 <- airquality [rowSums (is.na (airquality))> 0]
스테 리츠

4

더 간결 : sum(is.na(x[1]))

그건

  1. x[1] 첫 번째 열을보세요

  2. is.na() 사실이라면 NA

  3. sum() TRUE이다 1, FALSE있다0


이 수 찾을 수 있습니다 원래의 질문에 대답하지 않는 NA대한의 모든 데이터에 열을
벤 Bolker

4

또 다른 그래픽 대안- plot_missing우수한 DataExplorer패키지의 기능 :

여기에 이미지 설명 입력

문서 는 또한 추가 분석을 위해이 결과를 저장할 수 있다는 사실을 지적합니다 missing_data <- plot_missing(data).


패키지 의 plot_missing()기능 DataExplorer은 이제 PlotMissing()입니다.
coip

1
@coip PlotMissing()는 더 이상 사용되지 않습니다. plot_missing()대신 사용하십시오 . 자세한 내용은 # 49 를 참조하세요.
Boxuan

2

누락 된 데이터를 확인하는 데 도움이되는 또 다른 함수는 funModeling 라이브러리의 df_status입니다.

library(funModeling)

iris.2는 일부 추가 된 NA가있는 홍채 데이터 세트입니다.이를 데이터 세트로 바꿀 수 있습니다.

df_status(iris.2)

그러면 각 열에있는 NA의 수와 백분율이 제공됩니다.


1

그래픽 솔루션이 하나 더있는 경우 visdat 패키지vis_miss.

library(visdat)
vis_miss(airquality)

여기에 이미지 설명 입력

Amelia상자에서 누락 된 부분에 대해 % s을 (를) 제공하는 작은 차이가있는 출력과 매우 유사합니다 .


1

Amelia 라이브러리는 누락 된 데이터를 처리하는 데 훌륭하다고 생각합니다. 누락 된 행을 시각화하기위한 맵도 포함되어 있습니다.

install.packages("Amelia")
library(Amelia)
missmap(airquality)

여기에 이미지 설명 입력

다음 코드를 실행하면 na의 논리 값이 반환됩니다.

row.has.na <- apply(training, 1, function(x){any(is.na(x))})

1

또 다른 그래픽 및 대화식 방법은 라이브러리의 is.na10함수 를 사용하는 것입니다 heatmaply.

library(heatmaply)

heatmaply(is.na10(airquality), grid_gap = 1, 
          showticklabels = c(T,F),
            k_col =3, k_row = 3,
            margins = c(55, 30), 
            colors = c("grey80", "grey20"))

여기에 이미지 설명 입력

큰 데이터 세트에서는 잘 작동하지 않을 것입니다 ..


0

특정 열에 대해 수행하려면 다음을 사용할 수도 있습니다.

length(which(is.na(airquality[1])==T))

4
논리 벡터를 T와 비교할 필요가 없습니다. 논리 벡터의 TRUE 요소 수를 합산하여 계산할 수도 있습니다.
Houshalter


0

dplyr수를 얻을 수있는 솔루션이 될 수있다 :

summarise_all(df, ~sum(is.na(.)))

또는 백분율을 얻으려면 :

summarise_all(df, ~(sum(is_missing(.) / nrow(df))))

누락 된 데이터는보기 흉하고 일관성이 없으며 NA소스 또는 가져올 때 처리되는 방식에 따라 항상 코딩되지 않을 수 있습니다 . 다음 함수는 데이터와 누락 된 것으로 간주하려는 항목에 따라 조정할 수 있습니다.

is_missing <- function(x){
  missing_strs <- c('', 'null', 'na', 'nan', 'inf', '-inf', '-9', 'unknown', 'missing')
  ifelse((is.na(x) | is.nan(x) | is.infinite(x)), TRUE,
         ifelse(trimws(tolower(x)) %in% missing_strs, TRUE, FALSE))
}

# sample ugly data
df <- data.frame(a = c(NA, '1', '  ', 'missing'),
                 b = c(0, 2, NaN, 4),
                 c = c('NA', 'b', '-9', 'null'),
                 d = 1:4,
                 e = c(1, Inf, -Inf, 0))

# counts:
> summarise_all(df, ~sum(is_missing(.)))
  a b c d e
1 3 1 3 0 2

# percentage:
> summarise_all(df, ~(sum(is_missing(.) / nrow(df))))
     a    b    c d   e
1 0.75 0.25 0.75 0 0.5
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.