Entfernen Sie Jahreswerte, wenn Monat oder Quartal fehlen
Ich habe monatliche, vierteljährliche und jährliche Daten für verschiedene IDs. Wenn für einen Monat der Wert fehlt, müssen wir abhängig davon, in welches Quartal dieser Monat fällt, dieses Quartal und auch den Jahreswert kennzeichnen.
Ebenso, wenn vierteljährlich und jährlich gemeldet werden und wenn ein Quartal fehlt. Dann müssen die Jahreswerte gekennzeichnet werden.
Falls keine monatlichen Werte fehlen, sollten vierteljährlich und jährlich NICHT markiert werden.
In der folgenden Tabelle nach ID 1 gefiltert ...
- Zeile 2 ist der Wert für Quartal 1. Wir behalten dies bei, da der monatliche Wert in diesem Quartal nicht fehlt.
- Zeile 6 ist der Wert für Quartal 2. Es ist markiert, weil Monat 4 einen fehlenden Wert hat und Monat 4 zu Quartal 2 gehört.
- ähnlicher Fall für Zeile 10 (Q3), da die Monate 7 und 8 fehlen. Zeile 14 (Q4), da Monat 12 fehlt
- Zeile 1 ist der Jahreswert. Wir kennzeichnen es, weil wir in diesem Jahr insgesamt Monate mit fehlendem Wert haben
Example table:
# A tibble: 17 x 6
id value month quarter year flag
<int> <int> <int> <int> <int> <int>
1 1 1232 NA NA 2017 1
2 1 75 NA 1 2017 0
3 1 26 1 1 2017 0
4 1 29 2 1 2017 0
5 1 20 3 1 2017 0
6 1 93 NA 2 2017 1
7 1 NA 4 2 2017 0
8 1 33 5 2 2017 0
9 1 35 6 2 2017 0
10 1 51 NA 3 2017 1
11 1 NA 7 3 2017 0
12 1 NA 8 3 2017 0
13 1 3 9 3 2017 0
14 1 55 NA 4 2017 1
15 1 15 10 4 2017 0
16 1 25 11 4 2017 0
17 1 NA 12 4 2017 0
dput(df)
structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L), value = c(1232L, 75L, 26L, 29L, 20L,
93L, NA, 33L, 35L, 51L, NA, NA, 3L, 55L, 15L, 25L, NA, 1232L,
75L, 26L, 29L, 20L, 93L, 5L, 33L, 35L, 51L, 6L, NA, 3L, 55L,
15L, 25L, NA, 1232L, 75L, 26L, 29L, NA, 5L, 33L, 35L, 6L, NA,
3L, 15L, 25L, NA), month = c(NA, NA, 1L, 2L, 3L, NA, 4L, 5L,
6L, NA, 7L, 8L, 9L, NA, 10L, 11L, 12L, NA, NA, 1L, 2L, 3L, NA,
4L, 5L, 6L, NA, 7L, 8L, 9L, NA, 10L, 11L, 12L, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), quarter = c(NA, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, NA,
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L,
NA, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L), year = c(2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 217L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L)), class = "data.frame", row.names = c(NA, -48L))
gewünschte Ausgabe
> dput(df_output)
structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L), value = c(1232L, 75L, 26L, 29L, 20L,
93L, NA, 33L, 35L, 51L, NA, NA, 3L, 55L, 15L, 25L, NA, 1232L,
75L, 26L, 29L, 20L, 93L, 5L, 33L, 35L, 51L, 6L, NA, 3L, 55L,
15L, 25L, NA, 1232L, 75L, 26L, 29L, NA, 5L, 33L, 35L, 6L, NA,
3L, 15L, 25L, NA), month = c(NA, NA, 1L, 2L, 3L, NA, 4L, 5L,
6L, NA, 7L, 8L, 9L, NA, 10L, 11L, 12L, NA, NA, 1L, 2L, 3L, NA,
4L, 5L, 6L, NA, 7L, 8L, 9L, NA, 10L, 11L, 12L, NA, NA, NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), quarter = c(NA, 1L,
1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, NA,
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L,
NA, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L), year = c(2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L, 2017L,
2017L, 2017L), flag = c(1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L,
0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L)), class = "data.frame", row.names = c(NA,
-48L))
Das habe ich bisher
df_output %>%
dplyr::group_by(id,year) %>%
dplyr::mutate(quarter_d = dplyr::case_when(
is.na(month) & !is.na(quarter) ~ paste("Q",quarter,year,sep="_"),
)) %>%
dplyr::mutate(quarter_flag = dplyr::case_when(
is.na(value) ~ paste("Q",ceiling(as.numeric(month) / 3),year,sep="_")
))
Antworten
Sie können NAzuerst für jedes Jahr und dann für jedes Quartal nach Werten suchen und 1 zuweisen, wenn einer dieser Werte 1 ist.
library(dplyr)
df %>%
group_by(id) %>%
mutate(year_flag = +(any(is.na(value)) & row_number() == 1)) %>%
group_by(quarter, .add = TRUE) %>%
mutate(quarter_flag = +(any(is.na(value)) & row_number() == 1)) %>%
ungroup %>%
mutate(flag = pmax(year_flag, quarter_flag))
# id value month quarter year year_flag quarter_flag flag
# <int> <int> <int> <int> <int> <int> <int> <int>
# 1 1 1232 NA NA 2017 1 0 1
# 2 1 75 NA 1 2017 0 0 0
# 3 1 26 1 1 2017 0 0 0
# 4 1 29 2 1 2017 0 0 0
# 5 1 20 3 1 2017 0 0 0
# 6 1 93 NA 2 2017 0 1 1
# 7 1 NA 4 2 2017 0 0 0
# 8 1 33 5 2 2017 0 0 0
# 9 1 35 6 2 2017 0 0 0
#10 1 51 NA 3 2017 0 1 1
# … with 38 more rows
Ich habe weitere Spalten gehalten year_flagund quarter_flagso , dass Sie verstehen , was los ist. Sie können sie aus der endgültigen Ausgabe entfernen, wenn sie nicht benötigt werden.
Ist das was du willst?
library(tidyverse)
missing_months <- df %>%
as_tibble %>%
filter(!is.na(month), is.na(value)) %>%
select(-value)
missing_quarter <- df %>%
as_tibble %>%
filter(is.na(month), !is.na(quarter), is.na(value)) %>%
select(-value)
df_output <- df %>%
left_join(missing_months %>% mutate(month = NA_integer_) %>% distinct(id, month, quarter, year, flag.x = 1L), by = c("id", "month", "quarter", "year")) %>%
left_join(missing_months %>% mutate(month = NA_integer_, quarter = NA_integer_) %>% distinct(id, month, quarter, year, flag.y = 1L), by = c("id", "month", "quarter", "year")) %>%
left_join(missing_quarter %>% mutate(quarter = NA_integer_) %>% distinct(id, month, quarter, year, flag.z = 1L), by = c("id", "month", "quarter", "year")) %>%
mutate(flag = pmax(flag.x, flag.y, flag.z, na.rm = TRUE)) %>%
select(-flag.x, -flag.y, -flag.z) %>%
replace_na(list(flag = 0L))