мутировать неделю 1-12 до 1 квартала - PullRequest
0 голосов
/ 23 октября 2018

Мой набор данных содержит информацию за каждый день в течение 48 недель.[снимок экрана с моим набором данных] [1]

Я надеюсь создать новую переменную с именем "квартал" и сделать каждое наблюдение, значение переменной недели которого = 1-12, будет помечено как "а", что означает "Первая четверть";Кроме того, сделайте каждое наблюдение, чье значение переменной недели = 13-24 помечено как «b», что означает «второй квартал».

Я пробовал mutate() и recode(), кажется, что все идет хорошоизменить только 1 значение:

Однако, когда я попытался обозначить первые 12 недель как четверть «а»;вторые 12 недель в качестве квартала "b", ... Сбой, например:

Ошибка: неожиданное '=' в: "ungroup (week)%>% mutate (квартал = recode (week,c ("1": "12") = "

Интересно, как я могу это исправить. Спасибо!

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

С ?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"))
0 голосов
/ 23 октября 2018

Что нужно учитывать, так это просто использовать пакет смазки и просто использовать переменные для недели и квартала соответственно, чтобы всегда иметь эту информацию.Это предполагает, что у вас есть переменная даты для каждого наблюдения, и вы ссылаетесь на стандартные кварталы, что звучит так, как вы!Конечно, сначала вам нужно установить пакет.

    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) 

Это может быть более обобщенный способ решения проблемы интервалов, чем просто жесткое кодирование через несколько интервалов самостоятельно.

0 голосов
/ 23 октября 2018

Мы можем использовать 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])
...