Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从月份推断季度列,从季度推断月份列_R_Dplyr_Tidyverse_Lapply_Purrr - Fatal编程技术网

R 从月份推断季度列,从季度推断月份列

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日 #>

我有一个列名称相同的数据帧列表,但是一些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日
#>  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
函数来获取日期


x
case\u when
if\u else
进行类型检查,因此所有条件输出都需要为相同类型。此外,不清楚为什么应在向量ie上检查
NULL
。列as
NULL
将自动删除,并且它可以存在于
列表中

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")))