r - Translate column values based on string match -


i have dataframe called mydf. mydf has values in every column either 1 letter or 2 letters. want replace values 0/0 if 1 of zero.zero vector elements , 0/1 if 1 of elements zero.one. , nothing if na or other character combinations.

zero.zero<-c("a","t","g","c") zero.one <-c("ag","at","ac","ga","gc","gt","ta","tc","tg","ct","cg","ca")  code this:  translation <-function(x){        if (mydf[,x] == zero.zero){                   mydf[,x]<-"0/0"                       }else{         if (mydf[,x]==zero.one)){                   mydf[,x]<-"0/1"         }       }     }         mydf  ap   bp   cp    @   ga         gt    ag   g   result  ap      bp   cp 0/0    0/1   0/1 0/0          0/1 0/0    0/1   0/0 

you can try:

tab<-stack(list("0/0"=zero.zero,"0/1"=zero.one)) mydf[]<-lapply(mydf,function(x) tab$ind[match(x,tab$value)]) #   ap   bp  cp #1 0/0  0/1 0/1 #2 0/0 <na> 0/1 #3 0/0  0/1 0/0 

with first line create lookup table in each element of zero.zero , zero.one coupled desired replacement. then, in second line perform same operation on each column of mydf through lapply. operation consists in finding each element of column stands in column values of our lookup table. take corresponding ind value. assign result of lapply mydf (via mydf[]<-) keep data.frame structure of mydf.

hope clarifies little.

data

mydf<-structure(list(ap = structure(c(1l, 1l, 1l), .label = "a", class = "factor"),  bp = structure(c(2l, na, 1l), .label = c("ag", "at"), class = "factor"),  cp = structure(c(2l, 3l, 1l), .label = c("g", "ga", "gt"), class = "factor")), .names = c("ap",  "bp", "cp"), class = "data.frame", row.names = c(na, -3l)) 

Comments

Popular posts from this blog

sublimetext3 - what keyboard shortcut is to comment/uncomment for this script tag in sublime -

java - No use of nillable="0" in SOAP Webservice -

ubuntu - Laravel 5.2 quickstart guide gives Not Found Error -