在多列数据框中转换具有不同格式的日期
Convert dates with different formats in data frame over multiple columns
我有如下所示的数据框(测试):
abx start stop abx2 start2 stop2 abx3 start3 stop3
cipro 07/10/12 07/10/12 flagyl 07/10/12 07/17/12 n/a n/a n/a
vanco 07/12/2012 07/15/2012 levo 07/20/2012 07/27/2012 n/a n/a n/a
这一直持续到 start9/stop9。我想将所有日期转换为标准日期格式。
我写了一个函数来根据日期中的字符数转换开始日期。计划为停靠点编写一个类似的函数。
dateconv <- function(x) {
as.character(x)
z <- ifelse(nchar(x) == 8, "y","Y")
date <- as.Date(x, format =paste0("%m/%d/%", z))
rm(z)
}
test[,grep("^start", names(test))] <- dateconv(test[,grep("^start",
names(test))])
知道我做错了什么吗?收到此错误:
as.Date.default(x, format = paste0("%m/%d/%", z)) 错误:
不知道如何将 'x' 转换为 class “日期”
更新(2015 年 2 月 20 日):
多亏了理查德的评论,我才开始工作(真的很像 grep("st(art|op)" :
g <- grep("st(art|op)", names(test), value = TRUE)
test[g] <- lapply(test[g], function(x) {
x <- as.character(x)
as.Date(x, format = paste0("%m/%d/%", ifelse(nchar(x) == 8, "y", "Y")))})
您最简单的选择是使用 lubridate 包中的 mdy()
:
library(lubridate)
dateFields <- grep('^(start|stop)',names(test),value=T)
test[,dateFields] <- lapply(test[,dateFields],mdy)
这是更改 test
数据框的一种方法。
g <- grep("st(art|op)", names(test), value = TRUE)
test[g] <- lapply(test[g], function(x) {
x <- as.character(x)
as.Date(x, format = paste0("%m/%d/%", ifelse(nchar(x) == 8, "y", "Y")))
}))
这给出了
# abx start stop abx2 start2 stop2 abx3 start3 stop3
# 1 cipro 2012-07-10 2012-07-10 flagyl 2012-07-10 2012-07-17 n/a <NA> <NA>
# 2 vanco 2012-07-12 2012-07-15 levo 2012-07-20 2012-07-27 n/a <NA> <NA>
其中test
是
test <- read.table(text = "abx start stop abx2 start2 stop2 abx3 start3 stop3\n cipro 07/10/12 07/10/12 flagyl 07/10/12 07/17/12 n/a n/a n/a\n vanco 07/12/2012 07/15/2012 levo 07/20/2012 07/27/2012 n/a n/a n/a", header = TRUE, stringsAsFactors=FALSE)
我有如下所示的数据框(测试):
abx start stop abx2 start2 stop2 abx3 start3 stop3
cipro 07/10/12 07/10/12 flagyl 07/10/12 07/17/12 n/a n/a n/a
vanco 07/12/2012 07/15/2012 levo 07/20/2012 07/27/2012 n/a n/a n/a
这一直持续到 start9/stop9。我想将所有日期转换为标准日期格式。
我写了一个函数来根据日期中的字符数转换开始日期。计划为停靠点编写一个类似的函数。
dateconv <- function(x) {
as.character(x)
z <- ifelse(nchar(x) == 8, "y","Y")
date <- as.Date(x, format =paste0("%m/%d/%", z))
rm(z)
}
test[,grep("^start", names(test))] <- dateconv(test[,grep("^start",
names(test))])
知道我做错了什么吗?收到此错误: as.Date.default(x, format = paste0("%m/%d/%", z)) 错误: 不知道如何将 'x' 转换为 class “日期”
更新(2015 年 2 月 20 日): 多亏了理查德的评论,我才开始工作(真的很像 grep("st(art|op)" :
g <- grep("st(art|op)", names(test), value = TRUE)
test[g] <- lapply(test[g], function(x) {
x <- as.character(x)
as.Date(x, format = paste0("%m/%d/%", ifelse(nchar(x) == 8, "y", "Y")))})
您最简单的选择是使用 lubridate 包中的 mdy()
:
library(lubridate)
dateFields <- grep('^(start|stop)',names(test),value=T)
test[,dateFields] <- lapply(test[,dateFields],mdy)
这是更改 test
数据框的一种方法。
g <- grep("st(art|op)", names(test), value = TRUE)
test[g] <- lapply(test[g], function(x) {
x <- as.character(x)
as.Date(x, format = paste0("%m/%d/%", ifelse(nchar(x) == 8, "y", "Y")))
}))
这给出了
# abx start stop abx2 start2 stop2 abx3 start3 stop3
# 1 cipro 2012-07-10 2012-07-10 flagyl 2012-07-10 2012-07-17 n/a <NA> <NA>
# 2 vanco 2012-07-12 2012-07-15 levo 2012-07-20 2012-07-27 n/a <NA> <NA>
其中test
是
test <- read.table(text = "abx start stop abx2 start2 stop2 abx3 start3 stop3\n cipro 07/10/12 07/10/12 flagyl 07/10/12 07/17/12 n/a n/a n/a\n vanco 07/12/2012 07/15/2012 levo 07/20/2012 07/27/2012 n/a n/a n/a", header = TRUE, stringsAsFactors=FALSE)