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

如何在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))

期望输出

namesyears_in_rankfinal_yir
A3.153.15
B4.254.25
C5.756.00
D6.907.00
ENANA

原始冗长实现方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:15:47