Ok Josh. Many thanks for your effort. Ashim : )
On Mon, Jul 18, 2011 at 1:34 PM, Joshua Wiley <jwiley.ps...@gmail.com>wrote: > On Mon, Jul 18, 2011 at 12:22 AM, Ashim Kapoor <ashimkap...@gmail.com> > wrote: > > ttt <- data.frame(A = c(Inf, 0, 0), B = c(1, 2, 3)) > >> > >> apply(ttt, 2, function(x) {x[is.infinite(x)] <- 0; x}) > >> > > > > Ok thank you. That does work. What does > > > > apply(ttt, 1, function(x) x[is.infinite(x)] <- 0 ) > > > > this return. I get all 0's,but can you explai why ? > > I think so, though it gets a bit messy. First we can simplify things > by getting rid of apply for now and just dealing with a simple vector. > > x <- c(Inf, 1) > > When you type: > > x[is.infinite(x)] <- 0 > > This function has the side effect of altering the object 'x', but it > does not actually return x (at least not for the default method, this > does not hold for data frames and possibly other methods that can be > dispatched). Let's see what apply() gets to work with: > > ## simple example vector > x <- c(Inf, 1) > ## store output of subassignment function > test <- x[is.infinite(x)] <- 0 > > ## look at test and x > > test > [1] 0 > > x > [1] 0 1 > > If you try different examples, you will see that 'test' will be > whatever the object on the right of the assignment operator was. In > your case, it is a singleton 0. Now, we can go look at the > documentation ?apply sepcifically look at the "Value" section which > is what is returned. > > If each call to 'FUN' returns a vector of length 'n', then 'apply' > returns an array of dimension 'c(n, dim(X)[MARGIN])' if 'n > 1'. > If 'n' equals '1', 'apply' returns a vector if 'MARGIN' has length > 1 and an array of dimension 'dim(X)[MARGIN]' otherwise. If 'n' is > '0', the result has length 0 but not necessarily the 'correct' > dimension. > > since n = 1, apply returns an array of dimension dim(X)[MARGIN] which > in your original case is equivalent to: > > > dim(ttt)[c(1, 2)] > [1] 3 2 > > so a 3 x 2 array is return populated with whatever value you were > using to replace Inf. You might think that because ttt is a data > frame, the data frame method for `[<-` would get dispatched, but this > is not the case because what you are actually passing is rows or > columns of the data frame which are just vectors > > > class(ttt) > [1] "data.frame" > > class(ttt) > [1] "data.frame" > > apply(ttt, 2, class) > A B > "numeric" "numeric" > > apply(ttt, 1, class) > [1] "numeric" "numeric" "numeric" > > apply(ttt, 1:2, class) > A B > [1,] "numeric" "numeric" > [2,] "numeric" "numeric" > [3,] "numeric" "numeric" > > > The simple way around all of this is to be clear what you what the > anonymous function (function(x) ) to return. > > People better versed in the more inner workings of R may have some > corrections to how I have explained it. > > HTH, > > Josh > > > > > Thank you. > > Ashim > > > > > > -- > Joshua Wiley > Ph.D. Student, Health Psychology > University of California, Los Angeles > https://joshuawiley.com/ > [[alternative HTML version deleted]] ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.