我想导入一个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"