2015-05-15 3 views
1

Я хотел бы оценить процент образцов ((0:1) пределов) descripted, как Sam столбцов, которые имеют точно такую ​​же информацию, как описано выше и ниже зондов (разработано как Abo и Bel в dfout, соответственно) И какие образцы являются совпадающими между зондами выше и ниже (рассчитаны как SamsA и SamsB в dfout соответственно).Получения совпадающей информации между строками

Входной df:

 df <- "Sam1 Sam2 Sam3 Sam4 Sam5 
Prb1 0  0 1 2 3  
Prb2 0  0 1 2 2  
Prb3 0  1 1 2 2  
Prb4 2  2 3 2 2" 

df <- read.table(text=df, header=T) 

Ожидаемый выход dfout:

dfout <- "Abo Bel SamsA SamsB 
     Prb1 NA 0.8 NA Sam1-Sam2-Sam3-Sam4 
     Prb2 0.8 0.8 Sam1-Sam3-Sam3-Sam4 Sam1-Sam3-Sam4-Sam5 
     Prb3 0.8 0.4 Sam1-Sam3-Sam4-Sam5 Sam4-Sam5 
     Prb4 0.4 NA Sam4-Sam5 NA" 

    dfout <- read.table(text=dfout, header=T) 

Любые идеи?

ответ

1

Это подход, который я бы, используя for() петли, и если заявления для ясности (они могут быть свернуты и векторизованными если эффективность имеет первостепенное значение:

df <- "Sam1 Sam2 Sam3 Sam4 Sam5 
Prb1 0  0 1 2 3  
Prb2 0  0 1 2 2  
Prb3 0  1 1 2 2  
Prb4 2  2 3 2 2" 

df <- read.table(text=df, header=T) 


for (i in 1:nrow(df)) { 
    if (i > 1) { 
    Sams <- df[i-1,1:5] == df[i,1:5] 
    df[i,"Abo"] <- sum(Sams)/5 
    df[i,"SamsA"] <- paste(names(df)[1:5][Sams], collapse="-") 
    } 
    if (i < nrow(df)) { 
    Sams <- df[i+1,1:5] == df[i,1:5] 
    df[i,"Bel"] <- sum(Sams)/5 
    df[i,"SamsB"] <- paste(names(df)[1:5][Sams], collapse="-") 
    } 
} 

out <- df[,c(8,6,9,7)] 

Объект out выглядит следующим образом:

> out 
    Abo Bel    SamsA    SamsB 
Prb1 NA 0.8    <NA> Sam1-Sam2-Sam3-Sam4 
Prb2 0.8 0.8 Sam1-Sam2-Sam3-Sam4 Sam1-Sam3-Sam4-Sam5 
Prb3 0.8 0.4 Sam1-Sam3-Sam4-Sam5   Sam4-Sam5 
Prb4 0.4 NA   Sam4-Sam5    <NA> 
Смежные вопросы