我想估算样本的百分比((0:1)
限制),描述为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)
有什么想法吗?
答案 0 :(得分:1)
这是我将采用的方法,使用=IF(F5=0,0,<ur calculated formula>)
循环和if语句清晰(如果效率至关重要,这些可以折叠和矢量化:
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