create all possible triplet (three at time) combinations in r -


the following example data of case:

        mark <- c(paste("m", 1:6, sep = "")); set.seed(123);      ind1 <- c(sample (c("a", "b", "h"), 6, replace = t));      set.seed(1234); ind2 <- c(sample (c("a", "b", "h"), 6, replace = t));       set.seed(12345); ind3 <- c(sample (c("a", "b", "h"), 6, replace = t));      set.seed (12344);      ind4 <- c(sample (c("a", "b", "h"), 6, replace = t));        set.seed(1234567); ind5 <- c(sample (c("a", "b", "h"), 6, replace = t));      myd <- data.frame (mark, ind1, ind2, ind3, ind4, ind5) 

the data

 myd   mark ind1 ind2 ind3 ind4 ind5 1   m1          h       b 2   m2    h    b    h    h    h 3   m3    b    b    h       h 4   m4    h    b    h       5   m5    h    h    b       h 6   m6       b       h    b 

i want compare possible (triplet - 3 @ time) comparison mark each variables (columns).

m1 & m2 & m3      -> first composition  m1 & m2 & m4      - > second comparison  m1 & m2 & m5 m1 & m2 & m6  m1 & m3 & m4 m1 & m3 & m5 m1 & m3 & m6 m2 & m3 & m4 m2 & m3 & m5 m2 & m3 & m6  ......................so on  

thus comparison triplet, loop be: t = triplet member, t1 = first, t2 = second, t3 = third

nevar <- 0   if (t1 =="a", t2 == "b", t3 == "h"){       newvar[i] <- 0       }        else{       if (t1 =="a", t2 == "b", t3 == "b"){        newvar[i] <- 1        } else {          if (t1 =="a", t2 == "a", t3 == "h"){         newvar[i] <- 1         } else {         newvar[i] <- "na"         }         }} 

how can achieve ?

edit:

lets ind1:  first comparison above list value of t1 = m1 = "a", t2 = m2 = "h", t3= m3 = "b"               newvar = "na"  second comparison: t1 = m1 = "a", t2 = m2 = "h",  t3 = m4 = "h"                 newvar = "na" 

m1....m6 rownames (like variable) , can apply ind1 ....ind6, once ready ind1

to create possible combinations can use

combins<-t(combn(levels(myd$mark)[myd$mark],3)) 

you can create function say

dum.fun<-function(x,myd){ dum.match<-match(x,myd$mark) dum.str<-"" dum.ans<-c() for(i in 2:6){ dum.str<-paste(myd[dum.match,i],collapse="") dum.ans[i-1]<-na if(dum.str=="abh"){ dum.ans[i-1]<-0}else{ if(dum.str=="abb"||dum.str=="aah"){ dum.ans[i-1]<-1 }} } dum.ans } 

then

out<-t(apply(combins,1,dum.fun,myd)) cbind(combins,out) > head(cbind(combins,out))      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [1,] "m1" "m2" "m3" na   "1"  na   na   na   [2,] "m1" "m2" "m4" na   "1"  na   na   na   [3,] "m1" "m2" "m5" na   "0"  na   na   na   [4,] "m1" "m2" "m6" na   "1"  na   na   na   [5,] "m1" "m3" "m4" "0"  "1"  na   na   na   [6,] "m1" "m3" "m5" "0"  "0"  na   na   na   

for example

its rather messy have grasped wanted.

or 1 call

t(combn(levels(myd$mark)[myd$mark],3,dum.fun,myd=myd)) 

Comments

Popular posts from this blog

c# - SVN Error : "svnadmin: E205000: Too many arguments" -

c++ - Using OpenSSL in a multi-threaded application -

All overlapping substrings matching a java regex -