R语言新神器visdat包(一行代码看穿整个数据集)

2019-05-31 14:11:57 浏览数 (2)

这是一个非常简单,功能却非常强大的包

介绍

(1)visdat的目的是

vis_dat通过将数据框中的变量类显示为绘图,并使用vis_miss简要查看缺失的数据,帮助数据框的可视化。

(2)visdat有6个功能函数:
  • vis_dat()可视化一个数据框,显示列的类别,并显示缺少的数据。
  • vis_miss()只显示缺失的数据,并允许对缺失进行聚类并重新排列。vis_miss()类似于mi包中的missing.pattern.plot。
  • vis_compare()可视化相同维度的两个数据帧之间的差异
  • vis_expect()可视化数据中满足某些条件成立的数据
  • vis_cor()在一个漂亮的热图中可视化变量的相关性
  • vis_guess()可视化数据中各个数据的类别

示例

(1)使用vis_dat()函数

通过经典的airquality数据集(其中包含有关1973年5月至9月纽约每日空气质量测量的信息)展示vis_dat()的功能。

代码语言:javascript复制
install.packages("visdat")
head(airquality)
> head(airquality)
  Ozone Solar.R Wind Temp Month Day
1    41     190  7.4   67     5   1
2    36     118  8.0   72     5   2
3    12     149 12.6   74     5   3
4    18     313 11.5   62     5   4
5    NA      NA 14.3   56     5   5
6    28      NA 14.9   66     5   6
代码语言:javascript复制
library(visdat)
vis_dat(airquality)

上图告诉我们:R将此数据集读取为数值型或者整数型,并在OzoneSolar.R中存在一些缺失的数据。缺少的数据由灰色表示。通过图片的输出结果我们可以看出, OzoneSolar.RTempMonth Day这几列为数字型,而Wind这一列为整数型。

(2)使用vis_miss()函数
代码语言:javascript复制
vis_miss(airquality)

vis_miss()中缺失值的百分比精确到小数点后1位。可以通过设置cluster = TRUE来对缺失进行聚类:

代码语言:javascript复制
vis_miss(airquality,cluster = TRUE)

通过设置sort_miss = TRUE,列也可以按缺失最多的列排列:

代码语言:javascript复制
vis_miss(airquality,
         sort_miss = TRUE)

当缺失率<0.1%时,或者缺少数据的数量非常少时

代码语言:javascript复制
test_miss_df <- data.frame(x1 = 1:10000,
                           x2 = rep("A", 10000),
                           x3 = c(rep(1L, 9999), NA))

vis_miss(test_miss_df)

如果数据不含有任何缺失数据:

代码语言:javascript复制
vis_miss(mtcars)
(3) vis_compare()对比数据框差异

vis_compare()可以显示两个相同大小的数据帧的差异。 我们来看一个例子。

代码语言:javascript复制
set.seed(2019-04-03-1105)
chickwts_diff <- chickwts
chickwts_diff[sample(1:nrow(chickwts), 30),sample(1:ncol(chickwts), 2)] <- NA
vis_compare(chickwts_diff, chickwts)

两个数据框的差异被蓝色标出。如果尝试在列不同时比较两个数据框的差异,则会出现一个错误:

代码语言:javascript复制
chickwts_diff_2 <- chickwts
chickwts_diff_2$new_col <- chickwts_diff_2$weight*2

vis_compare(chickwts, chickwts_diff_2)
# Error in vis_compare(chickwts, chickwts_diff_2) : 
#   Dimensions of df1 and df2 are not the same. vis_compare requires dataframes of identical dimensions.
(4)vis_expect函数

vis_expect可视化数据中满足条件的值。 例如显示数据中大于25的值可以通过:

代码语言:javascript复制
vis_expect(airquality, ~.x >= 25)

还可以探索一组字符串或可能的NA值,并可视化它们的位置,

代码语言:javascript复制
bad_data <- data.frame(x = c(rnorm(100), rep("N/A", 10)),
                       y = c(rep("N A ", 30), rnorm(80)))

vis_expect(bad_data, ~.x %in% c("N/A", "N A "))
(5)为了便于绘制数据的相关性,请使用vis_cor函数:

vis_cor是基于基础R中的cor函数,并且可以指示要计算哪个相关系数: “pearson”(默认),“kendall”或“spearman”之一。

代码语言:javascript复制
vis_cor(airquality, cor_method = "spearman")

可以使用na_action函数指定要对缺失数据执行的操作,该函数再次借用cor方法。例如:

代码语言:javascript复制
vis_cor(airquality,
        na_action = "complete.obs")
(6)vis_guess()函数

用来猜测数据框中每个单元格是什么类型的数据。因此最好使用一些杂乱的数据进行说明:

代码语言:javascript复制
messy_vector <- c(TRUE,
                  T,
                  "TRUE",
                  "T",
                  "01/01/01",
                  "01/01/2001",
                  NA,
                  NaN,
                  "NA",
                  "Na",
                  "na",
                  "10",
                  10,
                  "10.1",
                  10.1,
                  "abc",
                  "$%TG")

set.seed(2019-04-03-1106)
messy_df <- data.frame(var1 = messy_vector,
                       var2 = sample(messy_vector),
                       var3 = sample(messy_vector))
messy_df
vis_guess(messy_df)

目前vis_guess非常缓慢。 当在超过1000行的数据上使用它时,请考虑这一点。

(7)绘制交互性图片

您可以通过将它们包装在plotly :: ggplotly中来制作visdat中的图:

代码语言:javascript复制
library(plotly)
ggplotly(vis_dat(airquality))
ggplotly(vis_miss(airquality))
ggplotly(vis_guess(airquality))

0 人点赞