[R] Vector DF [a, b] to replace values :was Finding the position of a variable in a data.frame
John Kane
jrkrideau at yahoo.ca
Thu Aug 3 18:09:56 CEST 2006
--- Peter Dalgaard <p.dalgaard at biostat.ku.dk> wrote:
> John Kane <jrkrideau at yahoo.ca> writes:
>
> > --- jim holtman <jholtman at gmail.com> wrote:
> >
> > > ?which
> > >
> > > > which(Df >= 50, arr.ind=T)
> > > row col
> > > 5 5 4
> >
> > This works very nicely as has some other
> suggestions
> > on how to replace a value. Assuming that I have
> more
> > than one correction to make where Df >= 50, can I
> use
> > vectors in the Df[] to do this.
> >
> > My attempt shows that I can use vectors but it
> appears
> > thatthere is something wrong with my logic
> >
> > Eample
> >
> > cat <- c( 3,5,6,8,0)
> > dog <- c(3,5,3,6, 0)
> > rat <- c (5, 5, 4, 9, 51)
> > bat <- c( 12, 42, 45, 32, 54)
> >
> > Df <- data.frame(cbind(cat, dog, rat, bat))
> > post <- which(Df >= 50, arr.ind=T) # find values
> .=
> > 50
> > post
> > correction <- c(77, 88) # new correct values
> > row <- post[ ,1] # vector for row number
> > col <- post[ ,2] # vector for column number
> >
> > Df[row,col] <- correction
> > Df
> >
> > -------result---------
> > cat dog rat bat
> > 1 3 3 5 12
> > 2 5 5 5 42
> > 3 6 3 4 45
> > 4 8 6 9 32
> > 5 0 0 88 88
> >
> > I am replacing both instances with 88 which is not
> > correct
>
> You're being bitten by two issues here: One is that
> Df[row,col] does
> not vectorize in parallel in the two indices:
> Df[1:2,1:2] has *four*
> elements, not two.
It took a moment to see it but it's rather obvious
now. I'm still fuzzy on the differences in behaviour
between a data frame and a matrix.
> Another is that data frames are
> not matrices: you
> can have different types of values in different
> columns, so you cannot
> expect to pick an arbitrary set of elements and
> assign a vector into
> it (well, it doesn't work, anyway).
>
> This sort of stuff works much easier with matrices,
> where we also have
> the wonderful feature of indexing with a matrix:
>
> > M <- cbind(cat, dog, rat, bat)
> > M[post]<- correction
> > M
> cat dog rat bat
> [1,] 3 3 5 12
> [2,] 5 5 5 42
> [3,] 6 3 4 45
> [4,] 8 6 9 32
> [5,] 0 0 77 88
Which of course I, stupidly thought that I was doing
in the data frame.
Thank you very much.
More information about the R-help
mailing list