r - 如何在日期不进行类型转换的情况下将列表转换为数据框

标签 r date dataframe types

我正在尝试编写一个脚本,它可以获取一个文件,查找与该文件相关的一些元数据,并根据该元数据转换某些列。例如,假设我的数据类似于以下输出:

test_data <- data.frame(date1 = c("03/02/2018","04/25/2018"),date2 = c("9/14/17","9/27/17"))

并假设基于元数据查找,我发现输入文件的列 date1date2 分别具有以下格式

date_formats <- c("%m/%d/%Y","%m/%d/%y")

因此我的脚本将继续将 index 定义为一个 bool 向量,其中包含值 TRUE,其中我有一个日期列和 FALSE否则,然后尝试将所有此类列转换为标准化的 R 日期格式:

test_data[,index] <- as.data.frame( 
                     lapply(test_data[,index],as.Date,
                     format = date_formats[index],
                               origin ="1970-01-01")))

但这会产生一些奇怪的输出:

  date1      date2
1 2018-03-02 0017-09-14
2 2020-04-25 2017-09-27

请注意 (1,2) 和 (2,1) 条目的年份是关闭的。我不明白为什么其他值被正确转换。那是谜 #1。

另一个谜团是,如果我尝试只转换一列,比如说

as.data.frame(lapply(test_data[,1],as.Date,format = c("%m/%d/%Y")))

然后我得到不需要的输出:

structure.17592..class....Date.. structure.17646..class....Date..
1                       2018-03-02                       2018-04-25

如果我先用 cbind a la

包装它
as.data.frame( cbind(lapply(test_data[,1],as.Date,format = c("%m/%d/%Y"))))

由于 cbind 的行为,我得到的是原始的、未格式化的日期值:

    V1
1 17592
2 17646

那么我该如何编写这个通用方法来处理任意数量的列,具有不同的格式,并将它们全部转换为数据框中相同格式的日期类型?

最佳答案

试试这个:

test_data <- data.frame(date1 = c("03/02/2018","04/25/2018"),date2 = c("9/14/17","9/27/17"))
date_formats <- c("%m/%d/%Y","%m/%d/%y")
index <- c(TRUE,TRUE)

test_data[,index] <- 
  as.data.frame( 
    lapply(which(index),function(i) 
      as.Date(test_data[[i]],
              format = date_formats[i],
              origin ="1970-01-01")))

#        date1      date2
# 1 2018-03-02 2017-09-14
# 2 2018-04-25 2017-09-27

您在 lapply 循环中提供给 date_formatsindex 的长度始终为 2,lapply 没有在其上循环。我们需要将您的 bool 索引转换为数字,然后对其进行循环。

这里是更清晰的代码来实现你想要的:

test_data[,index] <- 
  Map(as.Date,test_data[index],date_formats[index],origin ="1970-01-01")
#        date1      date2
# 1 2018-03-02 2017-09-14
# 2 2018-04-25 2017-09-27

关于r - 如何在日期不进行类型转换的情况下将列表转换为数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50662810/

相关文章:

r - 将大数区间转换为指定范围的较小区间

ruby-on-rails - 遍历过去 7 天的日期

javascript - toLocaleDateString() 不返回 dd/mm/yyyy 格式

python - 对 pandas DataFrame 进行分组和聚合以获得摘要 DataFrame

r - dplyr::summarise 根据另一列 max 提取值

r - R 中的快速 QR 分解

关于 ggplot_gtable 和 ggplot_build 的 R 文档

php - Laravel - 从数据库中的日期开始只取年份

python - 在 Python 中替换 DataFrame 的所有单元格中的值

r - 如何在 R 中划分缺失数据的不等数据帧