如何显示 R 中丢弃的观察值的数量?

How to show the number of dropped observations in R?

对于不同的分析,我使用不同的样本,但我需要让样本的来源透明化。 Stata 在每个 drop 命令后显示 "XX observations dropped"。有没有办法让 R 说明在“tidyverse 样式”样本选择期间丢弃在控制台中的观察数量(见下文)?在此示例中,我想在控制台中查看使用 filter 命令和 drop_na 命令删除了多少观察值。我尝试了 summarise_all(~sum(is.na(.))) 但没有成功。

capmkt_df <- stata_df %>%
  filter(change != 1 & reg_mkt == 1) %>% 
  select(any_of(capmkt_vars)) %>%
  mutate_at(vars(country, year), factor) %>%
  drop_na()

由于您使用的是 tidyverse 包,因此 tidylog 是一个很好的资源,该包为很多 tidyverse(包括 dplyrtidyr) 函数。

例如,使用 drop_na,您将收到一条消息 drop_na: removed X rows。基本 R airquality 数据集的插图:

library(tidyverse)
library(tidylog, warn.conflicts = F)

air_quality %>% 
  drop_na()

# drop_na: removed 42 rows (27%), 111 rows remaining
#     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      23     299  8.6   65     5   7
# 6      19      99 13.8   59     5   8
# 7       8      19 20.1   61     5   9
# 8      16     256  9.7   69     5  12
# 9      11     290  9.2   66     5  13
# 10     14     274 10.9   68     5  14
# ...

一个选项是在删除 NA 值之前打印非 complete.cases 的总和。在这里,我们可以使用 magrittr 中的三通管 (%T>%) 来打印结果。

library(tidyverse)

df %>%
  filter(x %in% c(1, 2, NA)) %T>%
  {print(sum(!complete.cases(.)))} %>%
  drop_na()

输出

因此,您会看到删除了 2 行,因为它们都有 NAs。

[1] 2
# A tibble: 1 × 2
      x y    
  <dbl> <chr>
1     1 a    

因此,对于您的代码,您可以这样写:

capmkt_df <- stata_df %>%
  filter(change != 1 & reg_mkt == 1) %>% 
  select(any_of(capmkt_vars)) %>%
  mutate_at(vars(country, year), factor) %T>%
  {print(sum(!complete.cases(.)))} %>%
  drop_na()

数据

df <- structure(list(x = c(1, 2, NA), y = c("a", NA, "b")), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -3L))