How do I write a function that converts character vector to date vector in R? -


this seems simple enough function write, think i'm misunderstanding requirements formal arguments / how r parses , evaluates function.

i'm trying write function converts character vector of form "%m/%d/%y" (and belonging data.frame df) date vector, , formats "%m/%d/%y", follows:

dateformat <- function(x) {   df$x <- (format(as.date(df$x, format = "%m/%d/%y"), "%m/%d/%y")) } 

i thinking that...

dateformat(a) 

... take "a" actual argument x , plug function, resolving as:

 df$a <- (format(as.date(df$a, format = "%m/%d/%y"), "%m/%d/%y")) 

however, following error when running dateformat(a):

error in as.date.default(df$x, format = "%m/%d/%y") :    not know how convert 'df$x' class “date” 

can please explain why understanding of formal/actual arguments and/or r function parsing/evaluation incorrect? thank you.

update

of course, variables want convert dates (e.g., df$a, df$b, df$c), write

df$a <- (format(as.date(df$a, format = "%m/%d/%y"), "%m/%d/%y"))

df$b <- (format(as.date(df$b, format = "%m/%d/%y"), "%m/%d/%y"))

df$c <- (format(as.date(df$c, format = "%m/%d/%y"), "%m/%d/%y"))

but i'm looking improve coding skills making more general function feed vector of variables. instance, if had df$a df$z, character variables wanted convert date variables? after write proper function, i'd perhaps run so:

for (n in letters) {   dateformat(n) } 

first, format(...) function returns character vector, not date, if x string,

format(as.date(x, format = "%m/%d/%y"), "%m/%d/%y") 

converts x date , character, in:

result <- format(as.date("01/03/2014", format = "%m/%d/%y"), "%m/%d/%y") result # [1] "01/03/2014" class(result) # [1] "character" 

second, referencing object, such df, in function, on lhs of expression, causes r create object in scope of function.

a <- 2 f <- function(x) <- x f(3) # [1] 2 

here, set variable, a, 2. in function create new variable, a in scope of function, set x (3), , destroy when function returns. in global environment a still 2.

if insist on using dateformat(...) function, should work work:

df <- data.frame(a=paste("01",1:10,"2014",sep="/"),                  b=paste("02",11:20,"2014",sep="/"),                  c=paste("03",21:30,"2014",sep="/"))  dateformat <- function(x) as.date(df[[x]], format = "%m/%d/%y") (n in letters[1:3]) df[[n]] <- dateformat(n) sapply(df,class) #           b      c  # "date" "date" "date"  

this more efficient though:

df <- as.data.frame(lapply(df,as.date,format="%m/%d/%y")) 

Comments

Popular posts from this blog

java - Oracle EBS .ClassNotFoundException: oracle.apps.fnd.formsClient.FormsLauncher.class ERROR -

c# - how to use buttonedit in devexpress gridcontrol -

nvd3.js - angularjs-nvd3-directives setting color in legend as well as in chart elements -