我的数据集包含48周内每天的信息。 [我的数据集的屏幕截图] [1]
我希望创建一个名为“ quarter”的新变量,并将每周变量值= 1-12的每个观察结果标记为“ a”,这意味着“第一季度”;另外,将每周变量值= 13-24的每个观察结果标记为“ b”,表示“第二季度”。
我尝试了mutate()
和recode()
,看来只变异1个值似乎很合适:
但是,当我尝试将前12周标记为季度“ a”时;第二个12周为季度“ b”,...失败,例如:
错误:出现意外的'=': “取消分组(周)%>% mutate(quarter = recode(week,c(“ 1”:“ 12”)=“
我想知道如何解决它。谢谢!
答案 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)
这可能是解决间隔问题的一种更通用的方法,而不是您自己在几个间隔中进行硬编码。