# [R] Vector DF [a, b] to replace values :was Finding the position of a variable in a data.frame

Peter Dalgaard p.dalgaard at biostat.ku.dk
Thu Aug 3 15:03:01 CEST 2006

```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. 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

--
O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
(*) \(*) -- University of Copenhagen   Denmark          Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)                  FAX: (+45) 35327907

```