R 从月份推断季度列,从季度推断月份列
我有一个列名称相同的数据帧列表,但是一些df有季度信息,而另一些有月份信息。有些人两者都有,或者两者都没有。所有数据帧都有年份信息。我试图建立一个条件并导出缺少的信息,以最终获得新列R 从月份推断季度列,从季度推断月份列,r,dplyr,tidyverse,lapply,purrr,R,Dplyr,Tidyverse,Lapply,Purrr,我有一个列名称相同的数据帧列表,但是一些df有季度信息,而另一些有月份信息。有些人两者都有,或者两者都没有。所有数据帧都有年份信息。我试图建立一个条件并导出缺少的信息,以最终获得新列QtrYr和Date。 库(dplyr) df#A tibble:13 x 3 #>m q y #> #>2016年11月1日 #>2016年12月2日 #>2016年1月3日 #>2017年4月2日 #>2017年5月2日 #>2017年6月2日 #>2018年7月7日 #>2018年8月3日 #>
QtrYr
和Date
。
库(dplyr)
df#A tibble:13 x 3
#>m q y
#>
#>2016年11月1日
#>2016年12月2日
#>2016年1月3日
#>2017年4月2日
#>2017年5月2日
#>2017年6月2日
#>2018年7月7日
#>2018年8月3日
#> 9 9 3 2018
#>10 NA 4 2020
#>11 NA 4 2020
#> 12 12 4 2020
#>13北美2020
lsdfm q y qy dy
#>
#>1不适用于2016年第1季度2016年3月1日
#>2不适用于2016年第1季度2016年3月1日
#>3不适用于2016年第1季度2016年3月1日
#>4 NA 2 2017年第二季度2017年第六季度
#>5 NA 2 2019年第二季度2017年第六季度
#>6 NA 2 2020年2017年第2季度2017年6月1日
#>7 7 NA 2017年第3季度/2018年9月1日
#>8 NA 3 2019年第3季度/2018年9月1日
#>9 9 3 2020年第三季度/2018年9月1日
#>10 NA 4 2016年第4季度/2020年12月1日/2020
#>11 NA 4 2017年第4季度/2020年12月1日
#>12 4 2019年第4季度/2020年12月1日
#>13北美2020
当时,我尝试使用
case\u,认为它相当简单,但看起来要么我没有按预期传递它,要么完全朝着错误的方向传递
lsdf$df1%>%dplyr::mutate(
Qrt=dplyr::case_何时(
is.na(m)&is.na(q)~na,
is.na(m)&!is.na(q)~q,
m!=NULL&q==NA~paste0(“q”,天花板(如数字(m)/3)),
m!=NULL&q!=NULL~paste0(“q”,q)
))
#>错误:`m!=NULL&q==NA~paste0(“q”,天花板(如数字(m)/3))`,`m!=NULL&q!=NULL~paste0(“Q”,Q)`长度必须为13或1,而不是0
由(v0.3.0)于2020年3月31日创建
我想我可以得到一个Qtryear列,然后运行这个zoo
函数来获取日期
xcase\u when
和if\u else
进行类型检查,因此所有条件输出都需要为相同类型。此外,不清楚为什么应在向量ie上检查NULL
。列asNULL
将自动删除,并且它可以存在于列表中
i、 e
及
在第二种情况下,NULL
将保持不变
在这里,如果我们正在进行检查,请使用is.null
和is.na
,并确保输出得到一种类型,q
列是数字的
(转换为字符
),而na
默认情况下是逻辑的(因此使用NA\u character\u
,因为最后一个条件输出创建了一个character
字符串和粘贴
)
此外,由于它是一个列表
,请使用映射
在列表
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)
)))
更新
如果我们需要updated中的'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"))))
这就是你想要的吗
lsdf$df1 %>%
mutate(Qrt = case_when(
!is.na(q) ~ q,
!is.na(m) & is.na(q) ~ ceiling(as.numeric(m)/3),
is.na(m) & is.na(q) ~ NA_real_
)) %>%
mutate(x = ifelse(is.na(Qrt), NA, paste0(Qrt, "/", y))) %>%
mutate(x = as.Date(zoo::as.yearqtr(x, format = "%q/%y")))
我稍微整理了一下您的案例。问题是您试图将字符和数字输出相结合。我已将Qrt
变量更改为数字。希望这能有所帮助。我认为您需要is.null
和is.na
如果只添加TRUE,那么T
是什么,但可能是NAit将无法工作因为当
需要对所有输出案例使用相同的类型时,case\u。在第二个表达式中,它是来自q的dbl,然后您正在执行粘贴
,即character非常感谢
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)
)))
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"))))
lsdf$df1 %>%
mutate(Qrt = case_when(
!is.na(q) ~ q,
!is.na(m) & is.na(q) ~ ceiling(as.numeric(m)/3),
is.na(m) & is.na(q) ~ NA_real_
)) %>%
mutate(x = ifelse(is.na(Qrt), NA, paste0(Qrt, "/", y))) %>%
mutate(x = as.Date(zoo::as.yearqtr(x, format = "%q/%y")))