R语言条件for循环问题:在数据框中搜索值及值组合
解决你的HR数据框循环问题
刚接触for循环踩坑太正常啦,我帮你梳理下思路,结合你的示例数据框来实现需求——根据Risk列的条件生成风险描述,再把这些描述作为新行添加到原数据框里。
首先先把你的示例数据框再明确下:
Repeat <- c("First","Second","Second","First","Second","Second") Risk <- c(50,20,70,40,80,20) df1 <- data.frame(Repeat,Risk)
第一步:定义风险判断规则
先假设你的条件是这样(你可以根据实际需求随意调整):
- 当
Risk > 60时,返回**"高风险HR"** - 当
30 ≤ Risk ≤ 60时,返回**"中风险HR"** - 当
Risk < 30时,返回**"低风险HR"**
第二步:用for循环实现需求
我们可以先创建一个空数据框来存储要添加的新行,然后遍历原数据框的每一行,判断Risk值生成对应描述,再把描述整理成行添加到空数据框,最后合并原数据框和新行数据框,实现原行和描述行交替排列的效果:
# 创建空数据框用于存储新行 new_rows <- data.frame(Repeat = character(), Risk = character(), stringsAsFactors = FALSE) # 遍历原数据框的每一行 for (i in 1:nrow(df1)) { current_risk <- df1$Risk[i] # 根据风险值生成描述 if (current_risk > 60) { risk_desc <- "高风险HR" } else if (current_risk >= 30) { risk_desc <- "中风险HR" } else { risk_desc <- "低风险HR" } # 将描述整理成新行,Repeat列标记为"风险描述",Risk列放描述内容 new_row <- data.frame(Repeat = "风险描述", Risk = risk_desc, stringsAsFactors = FALSE) # 添加到new_rows中 new_rows <- rbind(new_rows, new_row) } # 合并原数据框和新行数据框,实现原行1、描述行1、原行2、描述行2的顺序 combined_index <- c(rbind(1:nrow(df1), (nrow(df1)+1):(nrow(df1)+nrow(new_rows)))) df_combined <- rbind(df1, new_rows)[combined_index, ] # 查看最终结果 print(df_combined)
第三步:更高效的R风格实现(推荐)
其实在R里,我们完全可以不用for循环,用向量化操作来实现,代码更简洁高效。这里推荐用dplyr和tidyr包来完成:
library(dplyr) library(tidyr) # 先给原数据框添加风险描述列 df1_with_desc <- df1 %>% mutate(Risk_Desc = case_when( Risk > 60 ~ "高风险HR", Risk >= 30 ~ "中风险HR", TRUE ~ "低风险HR" )) # 将描述转换为新行,实现交替排列的效果 df_combined <- df1_with_desc %>% pivot_longer(cols = c(Risk, Risk_Desc), names_to = "Repeat", values_to = "Risk") %>% select(Repeat, Risk) # 查看结果 print(df_combined)
你可以根据自己的实际业务需求,修改Risk的阈值或者风险描述的内容,调整起来非常灵活。
内容的提问来源于stack exchange,提问作者Hanna
相关产品推荐
相关产品推荐

