将第1-12周更改为第1季度

时间:2018-10-23 18:59:45

标签: r database tidyverse mutate

我的数据集包含48周内每天的信息。 [我的数据集的屏幕截图] [1]

我希望创建一个名为“ quarter”的新变量,并将每周变量值= 1-12的每个观察结果标记为“ a”,这意味着“第一季度”;另外,将每周变量值= 13-24的每个观察结果标记为“ b”,表示“第二季度”。

我尝试了mutate()recode(),看来只变异1个值似乎很合适:

但是,当我尝试将前12周标记为季度“ a”时;第二个12周为季度“ b”,...失败,例如:

  

错误:出现意外的'=':   “取消分组(周)%>%     mutate(quarter = recode(week,c(“ 1”:“ 12”)=“

我想知道如何解决它。谢谢!

3 个答案:

答案 0 :(得分:2)

我们可以使用cut

cut(total_activity$week, c(-Inf, 12, 24, 36, 48), letters[1:4])

或者另一个选择是使用命名向量通过匹配替换值

names(setNames(1:48, rep(letters[1:4], each = 12))[total_activity$week])

答案 1 :(得分:2)

来自?recode

  

这是switch()的向量化版本:您可以根据其位置替换数字值,并根据其名称替换字符值。这是S3的泛型:dplyr提供了用于数字,字符和因子的方法。对于逻辑向量,请使用if_else()。对于更复杂的条件,请使用case_when()。

因此您可能需要使用case_when()

total_activity %>% 
ungroup(week) %>%
mutate(quarter = case_when(week %in% c("1":"12") ~ "a",
                           week %in% c("13":"24") ~ "b",
                           week %in% c("25":"36") ~ "c",
                           week %in% c("37":"48") ~ "d"))

答案 2 :(得分:0)

要考虑的只是使用润滑包,并分别使用变量week和Quarter来确保您始终拥有此信息。这是假设您为每个观测值都有一个日期变量,并且您所指的是标准季度,这听起来像是您自己!当然,您首先需要安装该软件包。

    library(lubridate)
    total_activity$Datevar <- mdy(Datevar) #this may change based on your date's format Month/Day/Year is very common.
    new.df <- total_activity %>% group_by(Day= day(day), Week= week(Datevar), Quarter= quarter(Datevar)) %>%
    mutate(total_activity= total_activity) 

这可能是解决间隔问题的一种更通用的方法,而不是您自己在几个间隔中进行硬编码。