使用循环在数据帧中用1-0替换高 - 低可能值

时间:2018-01-10 14:38:59

标签: r

我有以下数据框:

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

有人可以帮我写一个循环吗?

1 个答案:

答案 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.然后通过基于列名称排序恢复为原始格式。您可能想要考虑当两个边缘情况具有相同概率时会发生什么?