获取行之间的重合信息
Getting coincident information between rows
我想估计样本的百分比((0:1)
限制),描述为 Sam
列,它们在上面和下面的探针中具有完全相同的信息(设计为 Abo
和 dfout
中的 Bel
)以及哪些样本是上下探针之间的重合样本(设计为 dfout
中的 SamsA
和 SamsB
,分别)。
输入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>
我想估计样本的百分比((0:1)
限制),描述为 Sam
列,它们在上面和下面的探针中具有完全相同的信息(设计为 Abo
和 dfout
中的 Bel
)以及哪些样本是上下探针之间的重合样本(设计为 dfout
中的 SamsA
和 SamsB
,分别)。
输入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>