我的数据框(测试)看起来像这样:
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'转换为类“Date”
更新(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")))})
答案 0 :(得分:1)
以下是更改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)
答案 1 :(得分:0)
最简单的方法是使用lubridate包中的mdy()
:
library(lubridate)
dateFields <- grep('^(start|stop)',names(test),value=T)
test[,dateFields] <- lapply(test[,dateFields],mdy)