如何在R语言数据框中仅当小数≥0.75时向上取整并保留原列
简洁实现R语言数据框的数值调整需求
现有R语言数据框df1包含names和years_in_rank列,需要新增final_yir列,规则如下:
- 若
years_in_rank的小数部分≥0.75,将该值向上取整为整数 - 否则保留原数值
- 保留原
years_in_rank列
原始数据
df1 <- data.frame(names = c("A","B","C","D","E"), years_in_rank = c(3.15, 4.25, 5.75, 6.90, NA))
期望输出
| names | years_in_rank | final_yir |
|---|---|---|
| A | 3.15 | 3.15 |
| B | 4.25 | 4.25 |
| C | 5.75 | 6.00 |
| D | 6.90 | 7.00 |
| E | NA | NA |
原始冗长实现方法
library(tidyr) # 拆分年份为整数和小数部分 df1 %>% separate(years_in_rank, into = c("years_whole", "years_deci"), remove = FALSE) # 将小数部分转换为十进制 df1$years_deci <- as.numeric(as.character(df1$years_deci))/100 # 应用 rounding 规则 df1 <- df1 %>% mutate(years_deci_rounded = if_else(years_deci >= 0.75, round(years_deci, 0), years_deci),.after = years_deci) # 生成最终目标列 df1 <- df1 %>% mutate(final_yir = if_else(years_deci_rounded == 1, as.numeric(years_whole) + years_deci_rounded, years_in_rank),.after = years_deci_rounded)
简洁解决方案(使用case_when)
借助dplyr的case_when可以一步完成计算,无需拆分列,代码更简洁易读:
library(dplyr) df1 <- df1 %>% mutate(final_yir = case_when( # 提取小数部分,判断是否≥0.75,是则向上取整 (years_in_rank - floor(years_in_rank)) >= 0.75 ~ ceiling(years_in_rank), # 其他情况保留原数值,NA自动返回NA TRUE ~ years_in_rank ))
另一种简洁实现(基础向量运算)
如果不想加载dplyr,也可以用基础R的ifelse完成:
df1$final_yir <- ifelse((df1$years_in_rank - floor(df1$years_in_rank)) >= 0.75, ceiling(df1$years_in_rank), df1$years_in_rank)
这两种方法都能精准实现需求,同时自动处理NA值,保留原years_in_rank列。
内容的提问来源于stack exchange,提问作者OLNEY JEFFREY
相关产品推荐
相关产品推荐

