R语言实现先按行后按列设置小数位数(临床报告表格需求)
在R中实现按行设置小数位数后再按列调整表格格式
我需要制作一份临床试验报告表格,参数列在左侧,汇总统计量(均值、中位数等)列在顶部(这种格式最节省空间)。其中某一行数值极小,需要更高精度。能否先按行设置小数位数,再对剩余内容按列调整?他人已用SAS实现该效果,但我不知如何在R中复现。以如下示例数据为例,若先将第5行设置为5位小数,其余行设置为3位小数,是否可行?
示例数据与初始尝试
library(dplyr) # 生成示例数据 df <- data.frame(cbind(var1 = rnorm(10, 10, 1), var2 = rnorm(10, 10, 1), var3 = rnorm(10, 10, 1))) # 查看原始数据 df #> var1 var2 var3 #> 1 10.154649 10.705971 8.830994 #> 2 8.574063 10.773831 9.437210 #> 3 9.177850 10.639665 10.169646 #> 4 10.791533 8.560607 9.933333 #> 5 11.046810 9.220135 7.627125 #> 6 11.532739 8.990035 10.993207 #> 7 9.688523 10.078636 9.728344 #> 8 8.048989 10.203599 8.484947 #> 9 10.210700 9.414636 9.365975 #> 10 9.766223 10.137261 8.997470 # 示例:用formatC设置某一列的小数位数 df <- df |> mutate(var2 = formatC(var2, format = "f", digits = 2))
解决方案:按行设置小数位数,再按需调整列
完全可以实现,核心思路是先对指定行单独设置高精度小数位,其余行设置统一精度,之后可针对列做二次调整。以下是两种实用实现方式:
方法1:dplyr 逐行处理
利用rowwise()和across()实现按行判断并格式化:
library(dplyr) # 生成格式化后的表格 formatted_df <- df |> rowwise() |> mutate( across(everything(), ~ { # 对第5行设置5位小数,其余行3位 if (cur_group_rows() == 5) { formatC(.x, format = "f", digits = 5) } else { formatC(.x, format = "f", digits = 3) } }) ) |> ungroup() # 查看结果 print(formatted_df, row.names = TRUE)
方法2:Base R 实现(无需依赖dplyr)
直接通过行索引结合apply()函数处理:
# 复制原始数据,避免修改原数据 formatted_df_base <- df # 第5行设置5位小数 formatted_df_base[5, ] <- apply(formatted_df_base[5, , drop = FALSE], 2, function(x) formatC(x, format = "f", digits = 5)) # 其余行设置3位小数 formatted_df_base[-5, ] <- apply(formatted_df_base[-5, , drop = FALSE], 2, function(x) formatC(x, format = "f", digits = 3)) # 查看结果 print(formatted_df_base, row.names = TRUE)
后续按列调整(可选)
如果需要对特定列统一调整精度,直接覆盖即可。例如将var1列全部改为2位小数:
# dplyr方式 formatted_df <- formatted_df |> mutate(var1 = formatC(as.numeric(var1), format = "f", digits = 2)) # Base R方式 formatted_df_base$var1 <- formatC(as.numeric(formatted_df_base$var1), format = "f", digits = 2)
关键注意事项
- 格式化后的数据会转为字符型,若后续需统计计算,需用
as.numeric()转回数值型 formatC的format = "f"代表固定小数格式,digits参数控制小数位数- 若仅需控制显示精度(不改变数据类型),可直接用
print(df, digits = 3)这类方式,但仅影响输出显示,不修改数据本身
内容的提问来源于stack exchange,提问作者LucaS
相关产品推荐
相关产品推荐

