我有一个日期信息格式不正确的 Dataframe 。
date = c("18102016", "11102017", "4052017", "18102018", "3102018")
df <- data.frame(date = date, x1 = 1:5, x2 = rep(1,5))
我已经编写了函数fix_date_all()
,当应用于向量df$date
时,该函数会执行正确的格式设置
fix_date_all<- function(date){
fix_date <- function(d) {
if (nchar(d) != 8) d <- paste0("0", d)
dd <- d %>% substr(1,2)
mm <- d %>% substr(3,4)
yyyy <- d %>% substr(5,8)
d <- paste0(dd, ".", mm, ".", yyyy) %>% as.Date("%d.%m.%Y")
d
}
lapply(date, fix_date)
}
fix_date_all(df$date)
现在,我想使用tidyverse样式将此变量转换为适当的日期格式:
df %>% mutate(across(date, fix_date_all))
然而,当使用它在tidyverse风格,日期得到搞砸了。
date x1 x2
1 17092 1 1
2 17450 2 1
3 17290 3 1
4 17822 4 1
5 17807 5 1
4条答案
按热度按时间cidc1ykv1#
第二种选择是去掉
lapply
,并使用string::str_pad
等重写函数:hfsqlsce2#
输出是来自
lapply
调用的list
。我们需要用
c
将其展平或者在
purrr
的较新版本中,使用list_c
qybjjes13#
如果
sprintf
是short,则会在前面加上一个0,然后我们将其转换为Date。请注意,它是矢量化的,并且在
mutate
内工作:hs1ihplo4#
使用
sapply
代替lapply
。但同时,只需使用矢量化的ifelse
,如下所示: