[R] use of apply in a data frame on a row by row basis
andy_liaw at merck.com
Thu Jul 6 15:21:06 CEST 2006
?apply has the answer, in particular, in the "Detail" section:
If X is not an array but has a dimension attribute, apply attempts
to coerce it to an array via as.matrix if it is two-dimensional
(e.g., data frames) or via as.array.
Thus the function being apply()'ed should not be expecting a 1-row
data frame. Instead, it should be expecting a vector.
From: Julien Laugel
> Hello all,
> I'm trying to use the apply function on a data frame, by
> applying a function that takes a one row data.frame as argument .
> Here's the example :
> myfun = function(x) paste(x$f1 , x$f2)
> df = data.frame(f1 = c(1,4,10),f2 = "hello")
> apply(df,1,myfun) ==> Does not work (I get "character(0)" )
> Though : myfun(df[1,]) works,
> and myfun(df) works as well.
> So if myfun(df) works, that's fine!
> BUT, if the output of the function a bit more complex, it
> does not work :
> In this case I'm using a timeSeries object (from Rmetrics)
> timerange = timeSequence(from = "2001-04-11", length.out =
> 3,by = "weeks", format = "%Y-%m-%d", FinCenter = "GMT")
> myfun2 = function(x) timeSeries(rnorm(3),timerange)
> In this case, myfun2(df) returns only the result of the 1st row!
> apply(df,1,myfun2) in this case, does work
> But I haven't used the "$" notation to access one field Now
> if I try (and that is the cas that bugs me currently) :
> myfun3 = function(x) timeSeries(rep(x$f1,3),timerange)
> Error in "rownames<-"(`*tmp*`, value = c("2001-04-11
> 02:00:00", "2001-04-18 02:00:00", :
> length of 'dimnames'  is not equal to range of the array
> (sorry for the translation : I'm using a french version of R) Though
> > myfun3(df[1,])
> 2001-04-11 02:00:00 1
> 2001-04-18 02:00:00 1
> 2001-04-25 02:00:00 1
> works well
> BUT :
> yields :
> Error in array(x, c(length(x), 1), if (!is.null(names(x)))
> list(names(x), :
> trying to change an attribute in NULL
> So as a result I'm verry annoyed, and I don't see the logic behind.
> How can I do to make a apply-like function on the latter
> function? (myfun3)
> Many thanks in advance
> [[alternative HTML version deleted]]
> R-help at stat.math.ethz.ch mailing list
> PLEASE do read the posting guide!
More information about the R-help