获取行之间的重合信息

Getting coincident information between rows

我想估计样本的百分比((0:1) 限制),描述为 Sam 列,它们在上面和下面的探针中具有完全相同的信息(设计为 Abodfout 中的 Bel)以及哪些样本是上下探针之间的重合样本(设计为 dfout 中的 SamsASamsB,分别)。

输入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)

有什么想法吗?

这是我会采用的方法,使用 for() 循环和 if 语句以清晰起见(如果效率最重要,这些可以折叠和矢量化:

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>