Jabez Wilson
2008-Jan-16 16:45 UTC
[R] replace numbers in a column conditional on their value
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? --------------------------------- [[alternative HTML version deleted]]
Erik Iverson
2008-Jan-16 16:57 UTC
[R] replace numbers in a column conditional on their value
Try something like, ##Untested zz$FC <- ifelse(zz$FC > 2, zz$FC^2, zz$FC) and see ?ifelse -Erik Iverson 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? > > > > --------------------------------- > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at 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.
Richard.Cotton at hsl.gov.uk
2008-Jan-16 17:01 UTC
[R] replace numbers in a column conditional on their value
> 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]^2Try zz$FC[zz$FC > 2] <- (zz$FC[zz$FC > 2])^2 Regards, Richie. Mathematical Sciences Unit HSL ------------------------------------------------------------------------ ATTENTION: This message contains privileged and confidential inform...{{dropped:20}}
Rolf Turner
2008-Jan-16 19:45 UTC
[R] replace numbers in a column conditional on their value
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}}