gpt4 book ai didi

r - 从月份推断季度列,从季度推断月份列

转载 作者:行者123 更新时间:2023-12-04 10:18:48 25 4
gpt4 key购买 nike

我有一个列名相同的数据框列表,但是一些 df 有季度信息,而另一些则有月份信息。有些人两者兼而有之。所有数据框都有年份信息。我正在尝试建立一个条件并导出缺失的信息,以最终获得新列 QtrYrDate .

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

创建于 2020-03-31 由 reprex package (v0.3.0)

我想我可以得到一个 Qtryear 列然后运行这个 zoo获取日期的函数。

 x <- c("Q1/13", "Q2/14")
as.Date(zoo::as.yearqtr(x, format = "Q%q/%y"))

感谢您对解决此问题的任何帮助。

最佳答案

case_whenif_else做类型检查,所以所有的条件输出都需要是相同的类型。另外,不清楚为什么NULL应该在向量上检查,即。列为 NULL将被自动删除,它可以存在于 list 中。环境

IE。

c(NA, NULL, 1:3)
[1] NA 1 2 3


list(NULL, NULL, 1:3) 
#[[1]]
#NULL

#[[2]]
#NULL

#[[3]]
#[1] 1 2 3

在第二种情况下, NULL将保持原样

在这里,如果我们正在进行检查,请使用 is.null连同 is.na ,并确保输出为单一类型,即 q列是 numeric (转换为 character )而 NA默认情况下是逻辑的(所以使用 NA_character_ 因为最后一个条件输出创建一个 character 字符串和 paste )
library(dplyr)
lsdf$df1 %>% dplyr::mutate(
Qrt = dplyr::case_when(
is.na(m) & is.na(q) ~ NA_character_,
is.na(m) & !is.na(q) ~ as.character(q),
!is.null(m) & !is.na(q) ~ paste0("Q",ceiling(as.numeric(m)/3)),
!is.null(m) & !is.null(q) ~ paste0("Q", q)
))

另外,因为它是 list , 使用 map循环遍历 list
library(purrr)
map(lsdf, ~ .x %>% dplyr::mutate(
Qrt = dplyr::case_when(
is.na(m) & is.na(q) ~ NA_character_,
is.na(m) & !is.na(q) ~ as.character(q),
!is.null(m) & !is.na(q) ~ paste0("Q",ceiling(as.numeric(m)/3)),
!is.null(m) & !is.null(q) ~ paste0("Q", q)
)))

更新

如果我们需要更新中的“qy”列
library(tidyr)
library(stringr)
library(zoo)
library(lubridate)
map(lsdf, ~
.x %>%
mutate(q1 = q) %>%
fill(q, .direction = "downup") %>%
mutate(qy = case_when(is.na(m) & is.na(q1) ~ NA_character_,
TRUE ~ str_c("Q", q, "/", y))) %>%
select(-q1)%>%
mutate(dy = floor_date(as.Date(as.yearqtr(qy, "Q%q/%Y"), frac = 1), "month"))))

关于r - 从月份推断季度列,从季度推断月份列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60960242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com