如何解决使用 readr::read_csv() 导入日期
我想导入一个 CSV 文件
today,color
01/02,blue
01/04,green
03/14,orange
07/04,red
使用 readr 创建一列日期对象。
library(tidyverse)
library(lubridate)
read_csv("test.csv",col_types = "Dc") #first attempt
read_csv("test.csv",col_types = cols( #second attempt
col_date(format = "%m/%d"),col_character()))
我认为我的第一次尝试没有成功,因为日期格式不标准,所以在我的第二次尝试中,我是明确的。都没有成功,都返回了相同的警告。
Warning: 4 parsing failures.
row col expected actual file
1 today valid date 01/02 'test.csv'
2 today valid date 01/04 'test.csv'
3 today valid date 03/14 'test.csv'
4 today valid date 07/04 'test.csv'
# A tibble: 4 x 2
today color
<date> <chr>
1 NA blue
2 NA green
3 NA orange
4 NA red
我应该如何构建这个导入?
解决方法
它不是日期格式,因此 col_date
不起作用,即我们也需要 'year' 来拥有它。相反,最好将其读作 character
df1 <- read_csv("test.csv",col_types = "cc")
然后,根据需要添加year
部分,转换为Date
类
library(lubridate)
df1$today <- dmy(paste0(df1$today,"/2021"))
,
这里真正的问题是我们拥有的不是日期。日期有年份,问题中的输入没有年份。
1) 为了克服上述问题,我们可以定义一个特殊的类,它可以接受所需格式的月份和日期而不是年份。我们假设年份应该默认为当前年份。将它与 read.csv
一起使用,因为它可以与任意 S4 类一起使用。
行在最后的注释中定义。将 text=Lines 替换为要从文件中读取的文件名。
setClass("mmdd")
ch2mmdd <- function(from) as.Date(from,format = "%m/%d")
setAs("character","mmdd",ch2mmdd)
read.csv(text = Lines,colClasses = c("mmdd","character"))
给予:
today color
1 2021-01-02 blue
2 2021-01-04 green
3 2021-03-14 orange
4 2021-07-04 red
2) 或者,使用 read_csv
并在之后进行转换。这使用了 (1) 中的 ch2mmdd
函数,但不需要关联的 S4 类。另一方面,它在之后进行转换,而问题似乎想要按照 (1) 中读取的方式进行转换。
Lines %>%
read_csv %>%
mutate(today = ch2mmdd(today))
注意
Lines <- "today,color
01/02,blue
01/04,green
03/14,orange
07/04,red"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。