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.