Трудности с мутацией Tidyverse с факторами - PullRequest
0 голосов
/ 06 февраля 2019
library(tidyverse)
library(lubridate)
library(stringr)
df <- tibble(YrMo = as.factor(str_sub(ymd(c("2014-01-19", "2014-02-14")),1,7)))
df
#>  YrMo   
#>  <fct>  
#>  1 2014-01
#>  2 2014-02

Я пытаюсь создать второй столбец YrMo2, используя некоторые функции обратного хода.Два ожидаемых выхода - 2014-Jan и 2014-Feb, но вместо этого я получаю NA.

df %>% 
  mutate(
    YrMo2 = 
      factor(YrMo, 
             levels = format(as.Date(paste0(levels(YrMo), "-01")), "%Y-%b")
             )
    )

#> # A tibble: 2 x 2
#>   YrMo      YrMo2
#>   <fct>     <fct>
#>   1 2014-01 NA   
#>   2 2014-02 NA 

Я "знаю", что это должно работать, потому что функция base-R работает:

format(as.Date(paste0(levels(df$YrMo), "-01")), "%Y-%b")
#> [1] "2014-Jan" "2014-Feb"

Кажется очевидным, что мой синтаксис выключен.Но где?Или, может быть, это моя логика.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

В пакете forcats есть вспомогательные функции, облегчающие работу с уровнями. Если вы начали со строки, вы можете выполнить

library(forcats)
df <- tibble(YrMo = str_sub(ymd(c("2014-01-19", "2014-02-14")),1,7))
df %>% mutate(
  YrMo2 = fct_relabel(factor(YrMo, levels=sort(YrMo)), ~format(as.Date(paste0(.x, "-01")), "%Y-%b"))
)

. Мы используем factor(YrMo, levels=sort(YrMo)), чтобы убедиться, что значенияотсортировано правильно, затем мы используем fct_relabel() для переформатирования уровней при сохранении порядка.

0 голосов
/ 06 февраля 2019

Я думаю, что это даст вам то, что вы хотите:

df %>% 
  mutate(
    YrMo2 = factor(
      format(as.Date(paste0(YrMo, "-01")), "%Y-%b"), 
      levels = format(as.Date(paste0(levels(YrMo), "-01")), "%Y-%b")
    )
  )
# A tibble: 2 x 2
#  YrMo    YrMo2   
#  <fct>   <fct>   
#1 2014-01 2014-Jan
#2 2014-02 2014-Feb

Ваша проблема заключалась в том, что вы меняли аргумент levels на factor на уровни, которые не существовали в первом передаваемом аргументе,который вернет NA:

factor("X", levels = "x")
#[1] <NA>
#Levels: x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...