请求编写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循环逐行处理:- 提取当前行的7个概率值;
- 拿到该行需要保留的高值数量
top_k(也就是Predicted.SR的数值); - 通过
order(-prob_values)对概率值降序排序,得到对应的列索引,取前top_k个; - 先把当前行的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
相关产品推荐
相关产品推荐

