On 17/01/2008, at 5:45 AM, Jabez Wilson wrote: > Dear R help, > > I have a data frame column in which I would like to replace some > of the numbers dependent on their value. > > data frame = zz > > AveExpr t P.Value FC > 7.481964 7.323950 1.778503e-04 2.218760 > 7.585783 12.233056 6.679776e-06 2.155867 > 6.953215 6.996525 2.353705e-04 1.685733 > 7.647513 8.099859 9.512639e-05 1.674742 > 7.285446 7.558675 1.463732e-04 1.584071 > 6.405605 3.344031 1.276812e-02 1.541569 > > I would like to replace the values in column 'FC' which are >2 > with their squared value. > If I do this, however, I get a warning but it does the sum > correctly. > Warning message: > number of items to replace is not a multiple of replacement length > in: zz[, 4][zz[, 4] > 2] <- zz[, 4]^2 > > Is there a way to do this without the warning?
Other replies have suggested a better way to do this, but have not made it clear what you are doing wrong. The problem is that in your example you are effectively trying to replace 2 values with a vector of length 6 (i.e. zz[,4] ^2). This will use the first two values of the vector of length 6 to replace the two values that you've chosen to replace. This ``works'' in your example since your two values to be replaced come first in the column. But it *won't* work in general, warning message or no warning message. E.g. zz <- data.frame(x=1:6,y=1:6,z=1:6,w=c(1,2,3,3,2,1)) > zz x y z w 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 3 5 5 5 5 2 6 6 6 6 1 R > zz[,4][zz[,4]>2] <- zz[,4]^2 Warning message: In zz[, 4][zz[, 4] > 2] <- zz[, 4]^2 : number of items to replace is not a multiple of replacement length > zz x y z w 1 1 1 1 1 2 2 2 2 2 3 3 3 3 1 4 4 4 4 4 5 5 5 5 2 6 6 6 6 1 The two values (3rd and 4th) to be replaced got replaced by 1 and 4 --- the squares of the first two entries of the column. Moral of the story: ***DON'T SUPPRESS WARNINGS***!!! ***HEED THEM***!!! The use of ifelse that others have suggested is the right way to go. But you could do what you want using a syntax similar to that which you indeed used, but corrected as follows: > zz <- data.frame(x=1:6,y=1:6,z=1:6,w=c(1,2,3,3,2,1)) > zz[,4][zz[,4]>2] <- zz[,4][zz[,4]>2]^2 # See the difference? > zz x y z w 1 1 1 1 1 2 2 2 2 2 3 3 3 3 9 4 4 4 4 9 5 5 5 5 2 6 6 6 6 1 cheers, Rolf Turner ###################################################################### Attention:\ This e-mail message is privileged and confid...{{dropped:9}} ______________________________________________ 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.