我有以下数据框:
Sam = c("N1","N2","N3","N4","N5")
S1 = c(.7,.3,.4,.8,.2)
S2 = c(.6,.5,.6,.9,.9)
S3 = c(.5,.7,.8,.6,.6)
S4 = c(.6,.8,.5,.4,.8)
S5 = c(.9,.2,.6,.4,.5)
S6 = c(.8,.8,.7,.2,.7)
S7 = c(.8,.6,.7,.5,.6)
Predicted.SR = c(6,4,5,3,5)
df = data.frame(Sam,S1,S2,S3,S4,S5,S6,S7,Predicted.SR)
数据框df:
Sam S1 S2 S3 S4 S5 S6 S7 Predicted.SR
N1 0.7 0.6 0.5 0.6 0.9 0.8 0.8 6
N2 0.3 0.5 0.7 0.8 0.2 0.8 0.6 4
N3 0.4 0.6 0.8 0.5 0.6 0.7 0.7 5
N4 0.8 0.9 0.6 0.4 0.4 0.2 0.5 3
N5 0.2 0.9 0.6 0.8 0.5 0.7 0.6 5
我想做的是:首先,对每一行中的所有概率进行排名(降序)。然后我想用1替换物种的高概率值(直到预测的SR,例如对于行N1最多为6),并用0替换低概率值。
以下是我想要的新数据框架。
Sam S1 S2 S3 S4 S5 S6 S7 Pred.SR
N1 1 1 0 1 1 1 1 6
N2 0 0 1 1 0 1 1 4
N3 0 1 1 0 1 1 1 5
N4 1 1 1 0 0 0 0 3
N5 0 1 1 1 0 1 1 5
有人可以帮我写一个循环吗?
答案 0 :(得分:1)
out <- cbind(
Sam = df$Sam,
t(apply(df[, -1], 1, function(x) {
sorted <- sort(x[1:(length(x)-1)], decreasing = TRUE)
sorted[1:x[length(x)]] <- 1; sorted[(x[length(x)]+1):length(sorted)] <- 0
sorted <- sorted[sort(names(sorted), decreasing = FALSE)]
return(sorted)})),
Predicted.SR = df$Predicted.SR)
这可能是..对于每一行,首先根据概率排序并更改为1和0.然后通过基于列名称排序恢复为原始格式。您可能想要考虑当两个边缘情况具有相同概率时会发生什么?