r语言 - 使用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"))

这里真正的问题是我们拥有的不是Date。Date有年份,而问题中的输入没有年份。

1)为了克服上述问题,我们可以定义一个特殊的类,它可以接受所需格式的月和日,而不是年。我们假定年份默认为当前年份。与read.csv一起使用,因为它可以与任意的S4类一起使用。

Lines在末尾的注释中定义。将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"

相关内容

  • 没有找到相关文章

最新更新