Re: [R] Data frame index?

From: Duncan Murdoch <murdoch_at_stats.uwo.ca>
Date: Wed 18 Jan 2006 - 23:11:41 EST

On 1/18/2006 2:35 AM, Kenneth Cabrera wrote:
> Hi, R users:
>
> I have a data.frame (not a matrix), I got a vector with the same length
> as the
> number of records (rows) of the data frame, and each element of
> that vector is the column number (in a specific range of columns) of the
> corresponding
> record that I must set to zero.
>
> How can I do this without a "for" loop?

It sounds as though you've found that you can use two-column matrix indexing on a data frame for reading but not assigning. You create a matrix where the first column is the row number, and the second column is the column number. Then indexing by that selects those particular elements in order.

For instance, if you have named your vector of columns "cols", you'd do

my.data.frame[ cbind(1:rows, cols) ] <- 0

Here's an example:

 > df

    x y
1 1 a
2 1 a
3 1 a
4 1 a
5 1 a
6 1 a
7 1 a
8 1 a
9 1 a
10 1 a
 > df[cbind(1:4,c(1,2,1,2))]
[1] "1" "a" "1" "a"

But

 > df[cbind(1:4,c(1,2,1,2))] <- 0
Error in "[<-.data.frame"(`*tmp*`, cbind(1:4, c(1, 2, 1, 2)), value = 0) :

         only logical matrix subscripts are allowed in replacement

To get around this, construct the logical matrix using this method, then   use it as an index:

 > mat <- matrix(FALSE, 10, 2)
 > mat[cbind(1:4,c(1,2,1,2))] <- TRUE
 > df[mat] <- 0

Warning message:
invalid factor level, NAs generated in: "[<-.factor"(`*tmp*`, thisvar, value = 0)
 > df

    x y
1 0 a
2 1 <NA>
3 0 a
4 1 <NA>
5 1 a
6 1 a
7 1 a
8 1 a
9 1 a
10 1 a

If your columns are all numeric, you won't get the warning I got.

Duncan Murdoch



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html Received on Wed Jan 18 23:33:50 2006

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:42:06 EST