[R] how to have 'match' ignore no-matches

Tony Plate tplate at acm.org
Tue Oct 6 02:20:23 CEST 2009


> x <- data.frame(d=letters[1:3], e=letters[3:5])
> lookuptable <- c(a="aa", c="cc", e="ee")
> match.or.keep <- function(x, lookuptable) {if (is.factor(x)) x <- as.character(x); m <- match(x, names(lookuptable)); ifelse(is.na(m), x, lookuptable[m])}
> # to return a matrix
> apply(x, 2, match.or.keep, lookuptable=lookuptable)
     d    e   
[1,] "aa" "cc"
[2,] "b"  "d" 
[3,] "cc" "ee"
> # to return a data frame
> as.data.frame(lapply(x, match.or.keep, lookuptable=lookuptable))
   d  e
1 aa cc
2  b  d
3 cc ee
> 


Jill Hollenbach wrote:
> Let me clarify:
> I'm using this--
> 
> dfnew<- sapply(df, function(df) lookuptable[match(df, lookuptable [ ,1]),
> 2])
> 
>> lookup
> 0101   01:01
> 0201   02:01
> 0301   03:01
> 0401   04:01
> 
>> df
> 0101   0301
> 0201   0401
> 0101   0502
> 
>> dfnew
> 01:01   03:01
> 02:01   04:01
> 01:01   NA
> 
> but what I want is:
>> dfnew2
> 01:01   03:01
> 02:01   04:01
> 01:01   0502
> 
> thanks again,
> Jill
> 
> 
> 
> 
> Jill Hollenbach wrote:
>> Hi all,
>> I think this is a very basic question, but I'm new to this so please bear
>> with me.
>>
>> I'm using match to translate elements of a data frame using a lookup
>> table. If the content of a particular cell is not found in the lookup
>> table, the function returns NA. I'm wondering how I can just ignore those
>> cells, and return the original contents if no match is found in the lookup
>> table.
>>
>> Many thanks in advance, this site has been extremely helpful for me so
>> far,
>> Jill
>>
>> Jill Hollenbach, PhD, MPH
>>     Assistant Staff Scientist
>>     Center for Genetics
>>     Children's Hospital Oakland Research Institute
>>     jhollenbach at chori.org
>>
>




More information about the R-help mailing list