gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:16:18 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com