使用lubridate的quarter()函数遇转换错误及as.Date报错求助
问题分析与修正方案
第一个代码的错误原因及修正
你在dplyr管道中直接将select后的数据框传给quarter(),但quarter()的参数要求是单个日期/时间向量,而非整个数据框,这才触发了类型转换错误。
修正代码(新增季度列)
library(tidyverse) library(lubridate) people <- peopledata %>% select(`ID Number`, `Date Record Created`) %>% # 新增带年份的季度列 mutate(quarter_year = quarter(`Date Record Created`, with_year = TRUE))
修正代码(直接统计财季对接人数)
如果你的最终目标是按财季统计人数,可直接分组计数:
people_quarter_count <- peopledata %>% select(`ID Number`, `Date Record Created`) %>% # 按带年份的季度分组 group_by(quarter_year = quarter(`Date Record Created`, with_year = TRUE)) %>% # 统计去重的对接人数,无需去重则用n() summarise(对接人数 = n_distinct(`ID Number`))
第二个代码的错误原因及修正
filter_all之后管道传递的是整个数据框,你直接调用as.Date()时,相当于把整个数据框作为参数传入,而as.Date无法直接处理数据框,导致报错。正确做法是用mutate单独转换目标列的类型。
修正后的读取数据代码
peopledata <- read_excel("../People Activity.xlsx", sheet='People', col_names = T, col_types = NULL, na="", skip = 0) %>% filter_all(any_vars(!is.na(.))) %>% # 转换指定列为Date类型 mutate(`Date Record Created` = as.Date(`Date Record Created`, format = '%Y-%m-%d'))
额外提示
可以先运行str(peopledata)检查Date Record Created列的类型,read_excel通常能自动识别日期格式,若已为Date或POSIXct类型,无需手动转换。
内容的提问来源于stack exchange,提问作者Mary Rachel
相关产品推荐
相关产品推荐

