Hi, Is it possible to index via a character matrix? For example, I would like to do the following: cont.table <- table(df1$A,df1$B) # df1 a data frame with factors A and B cont.table[cbind(df2$A,df2$B)] # df2 a smaller data frame with some # pairings of values for A and B but the second step does not work -- I guess that matrices to be used for indexing this way must be numeric. Is there a way to index multiple character tuples out of a contingency table without resorting to writing loops? Many thanks, Roger Levy
On Mon, 13 Feb 2006, Roger Levy wrote:> Hi, > > Is it possible to index via a character matrix? For example, I would > like to do the following: > > cont.table <- table(df1$A,df1$B) # df1 a data frame with factors A and B > cont.table[cbind(df2$A,df2$B)] # df2 a smaller data frame with some > # pairings of values for A and B > > but the second step does not work -- I guess that matrices to be used > for indexing this way must be numeric. Is there a way to index multipleNumeric or logical.> character tuples out of a contingency table without resorting to writing > loops?What are you trying to do here? One possibility is that you meant comt.table[df2$A, df2$B] and another is ind1 <- match(df2$A, df1$A) ind2 <- match(df2$B, df1$B) cont.table[cbind(ind1, ind2)] and I am not certain which. -- 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
Prof Brian Ripley wrote:> On Mon, 13 Feb 2006, Roger Levy wrote: > >> Hi, >> >> Is it possible to index via a character matrix? For example, I would >> like to do the following: >> >> cont.table <- table(df1$A,df1$B) # df1 a data frame with factors A and B >> cont.table[cbind(df2$A,df2$B)] # df2 a smaller data frame with some >> # pairings of values for A and B >> >> but the second step does not work -- I guess that matrices to be used >> for indexing this way must be numeric. Is there a way to index multiple > > Numeric or logical. > >> character tuples out of a contingency table without resorting to writing >> loops? > > What are you trying to do here? One possibility is that you meant > > comt.table[df2$A, df2$B] > > and another is > > ind1 <- match(df2$A, df1$A) > ind2 <- match(df2$B, df1$B) > cont.table[cbind(ind1, ind2)] > > and I am not certain which. >Hmm, I think neither one is what I wanted. After thinking more about it, I think what I would need is ind1 <- match(df2$A,levels(df1$A)) ind2 <- match(df2$B,levels(df2$B)) cont.table[cbind(ind1,ind2)] Does this make sense? Is there a more natural way to express this? Many thanks, Roger
On Mon, 13 Feb 2006, Roger Levy wrote:> Prof Brian Ripley wrote: >> On Mon, 13 Feb 2006, Roger Levy wrote: >> >>> Hi, >>> >>> Is it possible to index via a character matrix? For example, I would >>> like to do the following: >>> >>> cont.table <- table(df1$A,df1$B) # df1 a data frame with factors A and B >>> cont.table[cbind(df2$A,df2$B)] # df2 a smaller data frame with some >>> # pairings of values for A and B >>> >>> but the second step does not work -- I guess that matrices to be used >>> for indexing this way must be numeric. Is there a way to index multiple >> >> Numeric or logical. >> >>> character tuples out of a contingency table without resorting to writing >>> loops? >> >> What are you trying to do here? One possibility is that you meant >> >> comt.table[df2$A, df2$B] >> >> and another is >> >> ind1 <- match(df2$A, df1$A) >> ind2 <- match(df2$B, df1$B) >> cont.table[cbind(ind1, ind2)] >> >> and I am not certain which. >> > > Hmm, I think neither one is what I wanted. After thinking more about it, I > think what I would need is > > ind1 <- match(df2$A,levels(df1$A)) > ind2 <- match(df2$B,levels(df2$B)) > cont.table[cbind(ind1,ind2)] > > Does this make sense? Is there a more natural way to express this?Not really. You said character, but you seem to have a factor (by the use of levels). It is the case that cont.table will have dims indexed by the levels of df1$A and df1$B, so perhaps you want ind1 <- match(df2$A,levels(df1$A)) ind2 <- match(df2$B,levels(df1$B)) cont.table[cbind(ind1,ind2)] That gives you a vector along rows of df2 giving the count of that A,B combination in df1 (provide all such occur). If some might not occur, use matchdf2$A,levels(df1$A), NA) etc. -- 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