簡體   English   中英

在 data.frame 中報告缺失值的優雅方式

[英]Elegant way to report missing values in a data.frame

這是我編寫的一小段代碼,用於報告數據框中缺少值的變量。 我試圖想出一種更優雅的方式來做到這一點,可能會返回一個 data.frame,但我被卡住了:

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

編輯:我正在處理包含數十到數百個變量的 data.frames,所以關鍵是我們只報告具有缺失值的變量。

只需使用sapply

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

您還可以在is.na()創建的矩陣上使用applycolSums

> 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 

我對(不太寬)數據的新寵是來自優秀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)

在此處輸入圖片說明

這些示例來自列出了其他有趣可視化的包小插圖

我們可以將map_df與 purrr map_df使用。

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
summary(airquality)

已經給你這個信息

VIM包還為 data.frame 提供了一些不錯的缺失數據圖

library("VIM")
aggr(airquality)

在此處輸入圖片說明

更簡潔-: sum(is.na(x[1]))

那是

  1. x[1]看第一列

  2. is.na()如果是NA is.na()

  3. sum() TRUE1FALSE0

另一個圖形替代方案 - 來自優秀DataExplorer包的plot_missing函數:

在此處輸入圖片說明

Docs還指出,您可以保存此結果以使用missing_data <- plot_missing(data)進行額外分析。

另一個可以幫助您查看丟失數據的函數是 funModeling 庫中的 df_status

library(funModeling)

iris.2 是添加了一些 NAs 的 iris 數據集。您可以將其替換為您的數據集。

df_status(iris.2)

這將為您提供每列中 NA 的數量和百分比。

我認為 Amelia 庫在處理缺失數據方面做得很好,還包括一個用於可視化缺失行的地圖。

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

在此處輸入圖片說明

也可以運行以下代碼將返回na的邏輯值

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

對於更多圖形解決方案, visdat提供vis_miss

library(visdat)
vis_miss(airquality)

在此處輸入圖片說明

Amelia輸出非常相似,只是在開箱即用時給出了 %s 的缺失值。

另一種圖形和交互方式是使用heatmaply庫中的is.na10函數:

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"))

在此處輸入圖片說明

可能不適用於大型數據集。

獲取計數的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

如果你想為特定的列做它,那么你也可以使用這個

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

ExPanDaR 的包函數prepare_missing_values_graph可用於探索面板數據:

在此處輸入圖片說明

對於管道,您可以編寫:

# Counts 
df %>% is.na() %>% colSums()

# % of missing rounded to 2 decimals 
df %>% summarise_all(.funs = ~round(100*sum(is.na(.))/length(.),2)) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM