【发布时间】:2019-02-06 20:50:59
【问题描述】:
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
我正在尝试使用一些 tidyverse 函数创建第二列 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"
看来我的语法是关闭的。但是哪里?或许这是我的逻辑。
【问题讨论】:
-
使用
factor()创建新因子时,levels=需要实际匹配向量中的值。如果它们不匹配,则将它们编码为 NA。如果您想要不同的名称,请按照与对应的levels=匹配的顺序使用labels=。 -
我建议不要过度广泛地使用
library(tidyverse)。它是一个方便的元包,可用于确保安装其所有依赖包,但是当您只需要(在此示例中)三个包时加载所有内容有点笨拙。在这种情况下,我会将其减少到dplyr代替tidyverse。