R:使用面板数据计算数据框中列每天缺失值 (NA) 的百分比,并删除缺失数据超过 25% 的日期

R: Calculate percentage of missing Values (NA) per day for a Column in a data frame using panel data and remove the days with missing data of over 25%

我有一个包含每日数据的庞大面板数据集。我想删除“大小”列中超过 25% 的观察数据丢失的所有日期。

我创建了以下数据来展示我的真实数据的样子:

structure(list(Product = c("A", "A", "A", "A", "A", "A", "A", 
"A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "C", "C", 
"C", "C", "C", "C", "C", "C", "C"), Date = c("01.09.2018", "02.09.2018", 
"03.09.2018", "04.09.2018", "05.09.2018", "11.11.2020", "12.11.2020", 
"13.11.2020", "14.11.2020", "01.09.2018", "02.09.2018", "03.09.2018", 
"04.09.2018", "05.09.2018", "11.11.2020", "12.11.2020", "13.11.2020", 
"14.11.2020", "01.09.2018", "02.09.2018", "03.09.2018", "04.09.2018", 
"05.09.2018", "11.11.2020", "12.11.2020", "13.11.2020", "14.11.2020"
), Size = c(10L, 9L, NA, 3L, 4L, 5L, 3L, NA, 6L, 7L, 4L, NA, 
4L, 6L, 6L, 4L, 6L, 7L, 3L, 4L, NA, 2L, 4L, NA, 7L, 7L, 5L)), class = "data.frame", row.names = c(NA, 
-27L))

我已经尝试了以下方法,但我了解了如何继续使用代码:

Data %>% summarize(group_by(Date), NoData=(is.na(Size))

然后我得到一个错误,我不能将 group_by 用于 class“日期”的对象。此外,我不知道如何自动删除“大小”列中缺失值超过 25% 的日期。

有人可以帮我解决我的问题吗?

感谢您的帮助。

如果您summarize(),您会丢失很多关于个别日子的信息。此外,在进一步的 dplyr 动词之前使用 group_by()。您可以通过将 NA 总和除以天数总和来计算 NA 的百分比。 as_tibble() 仅用于更好地显示行数,没有它也可以。我添加了一列“CountDate”,以便您知道同一天在您的数据框中出现了多少次。

Data %>% as_tibble() %>%  
  group_by(Date) %>% 
  mutate(CountDate = n(), PercNA = sum(is.na(Size))/n()*100)

# A tibble: 27 x 5
# Groups:   Date [9]
   Product Date        Size CountDate PercNA
   <chr>   <chr>      <int>     <int>  <dbl>
 1 A       01.09.2018    10         3    0  
 2 A       02.09.2018     9         3    0  
 3 A       03.09.2018    NA         3  100  
 4 A       04.09.2018     3         3    0  
 5 A       05.09.2018     4         3    0  
 6 A       11.11.2020     5         3   33.3
 7 A       12.11.2020     3         3    0  
 8 A       13.11.2020    NA         3   33.3
 9 A       14.11.2020     6         3    0  
10 B       01.09.2018     7         3    0  
# ... with 17 more rows

要删除 NA >25% 的日期,只需 filter():

Data %>% as_tibble() %>%  
  group_by(Date) %>% 
  mutate(CountDate = n(), PercNA = sum(is.na(Size))/n()*100) %>%
  filter(PercNA <25) %>% 
  ungroup()

# A tibble: 18 x 5
   Product Date        Size CountDate PercNA
   <chr>   <chr>      <int>     <int>  <dbl>
 1 A       01.09.2018    10         3      0
 2 A       02.09.2018     9         3      0
 3 A       04.09.2018     3         3      0
 4 A       05.09.2018     4         3      0
 5 A       12.11.2020     3         3      0
 6 A       14.11.2020     6         3      0
 7 B       01.09.2018     7         3      0
 8 B       02.09.2018     4         3      0
 9 B       04.09.2018     4         3      0
10 B       05.09.2018     6         3      0
11 B       12.11.2020     4         3      0
12 B       14.11.2020     7         3      0
13 C       01.09.2018     3         3      0
14 C       02.09.2018     4         3      0
15 C       04.09.2018     2         3      0
16 C       05.09.2018     4         3      0
17 C       12.11.2020     7         3      0
18 C       14.11.2020     5         3      0

@Gnueghoidune 的回答非常好。我只是想补充一点,可以直接在 filter() 中写入,从而避免使用 summarize()mutate()

下面是一个例子(我使用 mean(is.na(x)) 而不是 sum(is.na(x))/n()):

library(dplyr)

Data %>% 
  group_by(Date) %>% 
  filter(mean(is.na(Size)) <= 0.25)

#> # A tibble: 18 × 3
#> # Groups:   Date [6]
#>    Product Date        Size
#>    <chr>   <chr>      <int>
#>  1 A       01.09.2018    10
#>  2 A       02.09.2018     9
#>  3 A       04.09.2018     3
#>  4 A       05.09.2018     4
#>  5 A       12.11.2020     3
#>  6 A       14.11.2020     6
#>  7 B       01.09.2018     7
#>  8 B       02.09.2018     4
#>  9 B       04.09.2018     4
#> 10 B       05.09.2018     6
#> 11 B       12.11.2020     4
#> 12 B       14.11.2020     7
#> 13 C       01.09.2018     3
#> 14 C       02.09.2018     4
#> 15 C       04.09.2018     2
#> 16 C       05.09.2018     4
#> 17 C       12.11.2020     7
#> 18 C       14.11.2020     5

reprex package (v2.0.1)

于 2022-04-15 创建