0

以下は私の場合のデータ例です。

        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)

データ

 myd
  mark Ind1 Ind2 Ind3 Ind4 Ind5
1   M1    A    A    H    A    B
2   M2    H    B    H    H    H
3   M3    B    B    H    A    H
4   M4    H    B    H    A    A
5   M5    H    H    B    A    H
6   M6    A    B    A    H    B

各変数(列)のすべての可能な(トリプレット-一度に3つ)比較マークを比較したい。

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 

したがって、比較トリプレットの場合、ループは次のようになります。T = トリプレット メンバー、T1 = 1 番目、T2 = 2 番目、T3 = 3 番目

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"
        }
        }}

どうすればこれを達成できますか?

編集:

lets do for Ind1:

first comparison this above list
value of T1 = M1 = "A", T2 = M2 = "H", T3= M3 = "B"
              newvar = "NA"

Similarly second comparison:
T1 = M1 = "A", T2 = M2 = "H",  T3 = M4 = "H"
                newvar = "NA"

M1....M6 の行名 (変数など) と、これをすべての Ind1 ....Ind6 に適用できます。Ind1 の準備ができたら、

4

1 に答える 1

2

使用できる可能な組み合わせを作成するには

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

次に、次のような関数を作成できます

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
}

それから

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  

例えば

そのすべてはかなり厄介ですが、うまくいけば、私はあなたが望むものを把握しました。

または1回の呼び出しで

t(combn(levels(myd$mark)[myd$mark],3,dum.fun,myd=myd))
于 2012-07-01T13:04:11.117 に答える