Stephen D. Weigand
2005-Feb-24 04:00 UTC
[R] Row median of Date class variables in a data frame
I am trying to calculate the median of each row of a data frame where the data frame consist of columns of class Date. Below are my test data and best attempt at using apply. I didn't see a solution via Google or the Baron search site. I'd be grateful for any suggestions or solutions. I'm using R 2.0.0 on Mac OS X. Thank you, Stephen Weigand ### Test data date1 <- c(1000, 2000, 3000,4000) date2 <- date1 + 100 date3 <- date2 + 100 class(date1) <- class(date2) <- class(date3) <- "Date" test <- data.frame(date1, date2, date3) print(test) ### create a function for apply() medDate <- function(x){ obj <- unclass(unlist(x)) med <- median(obj, na.rm = TRUE) med class(med) <- "Date" med } medDate(test$date1) # works medDate(test[1,]) # works apply(test, 1, medDate) # gives error: 'need numeric data' apply(test, 2, medDate) # gives error: 'need numeric data'
Gabor Grothendieck
2005-Feb-24 04:14 UTC
[R] Row median of Date class variables in a data frame
Stephen D. Weigand <weigand.stephen <at> charter.net> writes: : : I am trying to calculate the median of each row of a : data frame where the data frame consist of : columns of class Date. : : Below are my test data and best attempt at using apply. : I didn't see a solution via Google or the Baron search : site. : : I'd be grateful for any suggestions or solutions. : I'm using R 2.0.0 on Mac OS X. : : Thank you, : : Stephen Weigand : : ### Test data : : date1 <- c(1000, 2000, 3000,4000) : date2 <- date1 + 100 : date3 <- date2 + 100 : : class(date1) <- class(date2) <- class(date3) <- "Date" : : test <- data.frame(date1, date2, date3) : : print(test) : : ### create a function for apply() : medDate <- function(x){ : obj <- unclass(unlist(x)) : med <- median(obj, na.rm = TRUE) : med : class(med) <- "Date" : med : } : : medDate(test$date1) # works : medDate(test[1,]) # works : : apply(test, 1, medDate) # gives error: 'need numeric data' : apply(test, 2, medDate) # gives error: 'need numeric data' : Try this: library(zoo) as.Date(apply(data.matrix(test), 1, median)) # ignore warning The only reason you need zoo is that it supplies as.Date methods which convert numerics and integers to Date.
Prof Brian Ripley
2005-Feb-24 07:17 UTC
[R] Row median of Date class variables in a data frame
Note that the argument to apply() is a matrix, not a data frame, so your object has been coerced to a matrix. That is spelled out on the help page for apply(), as it is frequent misuse. You would be better off using a matrix of class Date in the first place if you want row operations. On Wed, 23 Feb 2005, Stephen D. Weigand wrote:> I am trying to calculate the median of each row of a > data frame where the data frame consist of > columns of class Date. > > Below are my test data and best attempt at using apply. > I didn't see a solution via Google or the Baron search > site. > > I'd be grateful for any suggestions or solutions. > I'm using R 2.0.0 on Mac OS X. > > Thank you, > > Stephen Weigand > > > ### Test data > > date1 <- c(1000, 2000, 3000,4000) > date2 <- date1 + 100 > date3 <- date2 + 100 > > class(date1) <- class(date2) <- class(date3) <- "Date" > > test <- data.frame(date1, date2, date3) > > print(test) > > ### create a function for apply() > medDate <- function(x){ > obj <- unclass(unlist(x)) > med <- median(obj, na.rm = TRUE) > med > class(med) <- "Date" > med > } > > medDate(test$date1) # works > medDate(test[1,]) # works > > apply(test, 1, medDate) # gives error: 'need numeric data' > apply(test, 2, medDate) # gives error: 'need numeric data'-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595