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 创建
我有一个包含每日数据的庞大面板数据集。我想删除“大小”列中超过 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 创建