【发布时间】:2020-07-12 13:47:22
【问题描述】:
我有一个具有相同列名的数据框列表,但是一些 df 有季度信息,而其他有月份信息。有些人两者都有或两者都没有。所有数据框都有年份信息。我正在尝试建立一个条件并得出缺失的信息,以最终获得新列QtrYr 和Date。
library(dplyr)
df <- dplyr::tibble(
m = c(1, 2, NA, NA, NA, NA, 7, NA, 9, NA, NA, 12, NA),
q = c(NA, NA, 1, 2, 2, 2, NA, 3, 3, 4, 4, 4, NA),
y = c(2016, 2016, 2016, 2017, 2017, 2017, 2018 , 2018 , 2018 , 2020, 2020, 2020, 2020)
)
print(df)
#> # A tibble: 13 x 3
#> m q y
#> <dbl> <dbl> <dbl>
#> 1 1 NA 2016
#> 2 2 NA 2016
#> 3 NA 1 2016
#> 4 NA 2 2017
#> 5 NA 2 2017
#> 6 NA 2 2017
#> 7 7 NA 2018
#> 8 NA 3 2018
#> 9 9 3 2018
#> 10 NA 4 2020
#> 11 NA 4 2020
#> 12 12 4 2020
#> 13 NA NA 2020
lsdf <- list(df1 = df, df2 = df)
所需的输出。
out_df <- dplyr::tibble(
m = c(1, 2, NA, NA, NA, NA, 7, NA, 9, NA, NA, 12, NA),
q = c(NA, NA, 1, 2, 2, 2, NA, 3, 3, 4, 4, 4, NA),
y = c(2016, 2016, 2016, 2017, 2019, 2020, 2017, 2019, 2020, 2016, 2017, 2019, 2020),
qy = c("Q1/2016", "Q1/2016", "Q1/2016", "Q2/2017", "Q2/2017", "Q2/2017", "Q3/2018", "Q3/2018", "Q3/2018", "Q4/2020", "Q4/2020", "Q4/2020", NA),
dy = c("3/1/2016", "3/1/2016", "3/1/2016", "6/1/2017", "6/1/2017", "6/1/2017", "9/1/2018", "9/1/2018", "9/1/2018", "12/1/2020", "12/1/2020", "12/1/2020", NA)
)
print(out_df)
#> # A tibble: 13 x 5
#> m q y qy dy
#> <dbl> <dbl> <dbl> <chr> <chr>
#> 1 1 NA 2016 Q1/2016 3/1/2016
#> 2 2 NA 2016 Q1/2016 3/1/2016
#> 3 NA 1 2016 Q1/2016 3/1/2016
#> 4 NA 2 2017 Q2/2017 6/1/2017
#> 5 NA 2 2019 Q2/2017 6/1/2017
#> 6 NA 2 2020 Q2/2017 6/1/2017
#> 7 7 NA 2017 Q3/2018 9/1/2018
#> 8 NA 3 2019 Q3/2018 9/1/2018
#> 9 9 3 2020 Q3/2018 9/1/2018
#> 10 NA 4 2016 Q4/2020 12/1/2020
#> 11 NA 4 2017 Q4/2020 12/1/2020
#> 12 12 4 2019 Q4/2020 12/1/2020
#> 13 NA NA 2020 <NA> <NA>
我尝试使用case_when,认为它相当简单,但看起来要么我没有按预期通过它,要么完全走错了方向。
lsdf$df1 %>% dplyr::mutate(
Qrt = dplyr::case_when(
is.na(m) & is.na(q) ~ NA,
is.na(m) & !is.na(q) ~ q,
m != NULL & q == NA ~ paste0("Q",ceiling(as.numeric(m)/3)),
m != NULL & q != NULL ~ paste0("Q", q)
))
#> Error: `m != NULL & q == NA ~ paste0("Q", ceiling(as.numeric(m)/3))`, `m != NULL & q != NULL ~ paste0("Q", q)` must be length 13 or one, not 0
由reprex package (v0.3.0) 于 2020 年 3 月 31 日创建
我想我可以得到一个 Qtryear 列,然后运行这个 zoo 函数来获取日期。
x <- c("Q1/13", "Q2/14")
as.Date(zoo::as.yearqtr(x, format = "Q%q/%y"))
感谢您对解决此问题的任何帮助。
【问题讨论】:
-
我认为你需要
is.null和is.na -
case_when 中的
T是什么 -
只是添加 TRUE,但可能是 NA
-
它不起作用,因为
case_when需要对所有输出案例具有相同的类型。在第二个表达式中,它是来自 q 的 dbl,然后你正在做paste,即字符
标签: r dplyr tidyverse lapply purrr