You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求编写R循环:将数据框高概率值替换为1,低概率值替换为0

R语言实现按行概率值替换为1/0的循环方案

嘿,我来帮你搞定这个需求!咱们先明确目标:给每行的S1到S7这几个概率值降序排序,把前Predicted.SR个最高值替换成1,剩下的换成0,最终得到你想要的新数据框。

首先先还原你的原始数据框:

# 定义原始数据框
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)

接下来是实现需求的循环代码,逻辑清晰易理解:

# 创建新数据框,保留原始数据的结构和标识列
new_df = df

# 遍历每一行处理数据
for (i in 1:nrow(df)) {
  # 提取当前行的S1-S7概率值
  prob_values = df[i, c("S1", "S2", "S3", "S4", "S5", "S6", "S7")]
  # 获取当前行需要保留的高值数量
  top_k = df$Predicted.SR[i]
  # 对概率值降序排序,得到前top_k个值的列索引
  top_indices = order(-prob_values)[1:top_k]
  
  # 先把当前行的S1-S7全部置为0
  new_df[i, c("S1", "S2", "S3", "S4", "S5", "S6", "S7")] = 0
  # 将前top_k个高值对应的位置设置为1
  new_df[i, c("S1", "S2", "S3", "S4", "S5", "S6", "S7")[top_indices]] = 1
}

# 把列名改成你想要的"Pred.SR"
colnames(new_df)[colnames(new_df) == "Predicted.SR"] = "Pred.SR"

# 查看最终结果
print(new_df)

代码逻辑拆解

  • 先复制原始数据到new_df,避免直接修改原数据;
  • 用for循环逐行处理:
    1. 提取当前行的7个概率值;
    2. 拿到该行需要保留的高值数量top_k(也就是Predicted.SR的数值);
    3. 通过order(-prob_values)对概率值降序排序,得到对应的列索引,取前top_k个;
    4. 先把当前行的S1-S7全部设为0,再把前top_k个高值的位置替换为1;
  • 最后修改列名,得到你期望的格式。

运行代码后,输出的new_df就是你要的结果:

Sam S1 S2 S3 S4 S5 S6 S7 Pred.SR
1  N1  1  1  0  1  1  1  1       6
2  N2  0  0  1  1  0  1  1       4
3  N3  0  1  1  0  1  1  1       5
4  N4  1  1  1  0  0  0  0       3
5  N5  0  1  1  1  0  1  1       5

内容的提问来源于stack exchange,提问作者Ma-Moeys Sima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:50:01