[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