报告data.frame中缺失值的优雅方法

时间:2011-11-29 20:23:50

标签: r dataframe missing-data

这是我编写的一小段代码,用于报告数据框中缺少值的变量。我正在尝试一种更优雅的方式来实现这一点,可能会返回一个data.frame,但我被卡住了:

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

编辑:我正在处理包含数十到数百个变量的data.frames,因此关键是我们只报告缺少值的变量。

13 个答案:

答案 0 :(得分:137)

只需使用sapply

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

您还可以对apply

创建的矩阵使用colSumsis.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 

答案 1 :(得分:7)

我们可以将map_df与purrr一起使用。

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

答案 2 :(得分:5)

更简洁 - :sum(is.na(x[1]))

那是

  1. x[1]请看第一栏

  2. is.na()如果NA

  3. ,则为真
  4. sum() TRUE1FALSE0

答案 3 :(得分:5)

我最喜欢(不太宽的)数据的是来自出色的naniar包的方法。不仅获得频率,而且获得缺失的模式:

library(naniar)
library(UpSetR)

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

enter image description here

通常可以通过绘制散点图与缺失来查看缺失与非缺失之间的联系:

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

enter image description here

或用于分类变量:

gg_miss_fct(x = riskfactors, fct = marital)

enter image description here

这些示例来自软件包vignette,其中列出了其他有趣的可视化。

答案 4 :(得分:4)

另一个图形替代方案 - 来自优秀plot_missing包的DataExplorer函数:

enter image description here

Docs还指出您可以使用missing_data <- plot_missing(data)保存此结果以进行其他分析。

答案 5 :(得分:3)

summary(airquality)

已经为您提供此信息

VIM 包还为data.frame提供了一些不错的缺失数据图

library("VIM")
aggr(airquality)

manual

答案 6 :(得分:2)

另一个可以帮助你查看缺失数据的函数是来自funModeling库的df_status

library(funModeling)

iris.2是虹膜数据集,其中包含一些已添加的NAs。您可以将其替换为数据集。

df_status(iris.2)

这将为您提供每列中NAs的数量和百分比。

答案 7 :(得分:1)

对于另一个图形解决方案,visdat package提供vis_miss

library(visdat)
vis_miss(airquality)

enter image description here

非常类似于Amelia输出,在开箱即用的缺失情况下给出%s的差异很小。

答案 8 :(得分: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"))

enter image description here

可能不适用于大型数据集。

答案 9 :(得分:0)

如果您想对特定列进行此操作,那么您也可以使用此

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

答案 10 :(得分:0)

我认为Amelia库在处理缺失数据方面做得很好,还包括一个可视化缺失行的地图。

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

enter image description here

您还可以运行以下代码,返回na

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

答案 11 :(得分:0)

ExPanDaR的打包功能prepare_missing_values_graph可用于浏览面板数据:

enter image description here

答案 12 :(得分: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