[R] Data frame index?
Prof Brian Ripley
ripley at stats.ox.ac.uk
Wed Jan 18 15:10:52 CET 2006
It's worth noting that there are quite a few for loops inside the code
used by matrix indexing of data frames.
I think a single for-loop over the columns is as good as any, something
like
DF <- data.frame(x=1, y=rep("a", 4), z = 3)
ind <- c(1,3,3,1) # only numeric cols
for(i in unique(ind)) DF[ind==i, i] <- 0
DF
x y z
1 0 a 3
2 1 a 0
3 1 a 0
4 0 a 3
On Wed, 18 Jan 2006, Duncan Murdoch wrote:
> 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 at 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
>
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
More information about the R-help
mailing list