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
Post a Comment