在R中创建统计汇总表格、解决新变量报错及工具包推荐
问题解答
1. 创建包含连续/分类变量统计量的表格
连续变量(年龄、体重)
可以结合dplyr和tidyverse工具计算自定义统计量,示例代码如下:
# 生成示例数据 set.seed(123) df <- data.frame( age = rnorm(100, 30, 5), weight = rnorm(100, 65, 8), gender = sample(c("男", "女"), 100, replace = TRUE), education = sample(c("初中", "高中", "大学"), 100, replace = TRUE, prob = c(0.2, 0.3, 0.5)) ) # 计算连续变量的均值、标准差、95%置信区间 continuous_stats <- df %>% select(age, weight) %>% summarise(across(everything(), list( mean = ~mean(., na.rm = TRUE), sd = ~sd(., na.rm = TRUE), ci_lower = ~mean(., na.rm = TRUE) - qt(0.975, df = n()-1)*sd(., na.rm = TRUE)/sqrt(n()), ci_upper = ~mean(., na.rm = TRUE) + qt(0.975, df = n()-1)*sd(., na.rm = TRUE)/sqrt(n()) ))) %>% pivot_longer(everything(), names_sep = "_", names_to = c("variable", "stat")) %>% pivot_wider(names_from = stat, values_from = value) print(continuous_stats)
分类变量(性别、教育程度)
计算绝对频数、相对频数、累积频数,示例代码:
# 分类变量频数统计 categorical_stats <- df %>% select(gender, education) %>% map_dfr(function(col) { freq <- table(col) rel_freq <- prop.table(freq)*100 cum_freq <- cumsum(rel_freq) tibble( variable = rep(deparse(substitute(col)), length(freq)), category = names(freq), absolute_freq = as.integer(freq), relative_freq = round(rel_freq, 1), cumulative_freq = round(cum_freq, 1) ) }, .id = NULL) print(categorical_stats)
后续可使用gt或flextable包对表格进行美化输出。
2. 解决"variable not found"错误
出现该错误的常见原因及对应解决方法:
- 变量归属环境错误:如果变量是数据框的列,调用时需添加数据框前缀(如
df$new_var),或用with(df, ...)包裹代码,避免直接调用列名。 - 拼写/大小写错误:R对大小写敏感,核对变量名的拼写和大小写,比如
NewVar和newvar会被识别为两个不同变量。 - 管道链中断:用
%>%生成新变量时,若未将结果赋值给新数据框,变量仅在管道内临时存在。正确写法:# 错误写法:new_var仅在管道内有效 df %>% mutate(new_var = age + 10) print(new_var) # 正确写法:赋值给新数据框 df_new <- df %>% mutate(new_var = age + 10) print(df_new$new_var) - 函数环境隔离:自定义函数内生成的变量默认不会暴露到全局环境,需用
return()返回结果,或明确赋值到全局环境(不推荐)。 - 生成逻辑错误:若生成变量时用到含NA的列,可能导致变量未正确生成,检查
mutate语句逻辑,必要时添加na.rm = TRUE参数。
3. 统计表格常用R包及实现方式
通用类包
- tableone:专为基线表设计,支持同时处理连续和分类变量:
library(tableone) vars <- c("age", "weight", "gender", "education") cat_vars <- c("gender", "education") tab <- CreateTableOne(vars = vars, factorVars = cat_vars, data = df) print(tab, showAllLevels = TRUE) - gt:用于美化表格,配合tidyverse计算的统计量生成专业格式表格:
library(gt) continuous_stats %>% gt() %>% tab_header(title = "连续变量描述统计") %>% fmt_number(columns = c(mean, sd, ci_lower, ci_upper), decimals = 1)
连续变量专用实现
- dplyr + tidyr:灵活计算自定义统计量,适合个性化需求(如前文的置信区间计算)。
- psych:
describe()函数快速生成基础描述统计,包含均值、标准差、中位数等:library(psych) describe(df[, c("age", "weight")])
分类变量专用实现
- janitor:
tabyl()函数一键生成频数、相对频数表格,支持快速整理:library(janitor) df %>% tabyl(gender) %>% adorn_pct_formatting() %>% adorn_totals("row") - dplyr + tidyr:用
table()、prop.table()结合tidyverse函数手动整理频数表(如前文示例)。
内容的提问来源于stack exchange,提问作者user24829328
相关产品推荐
相关产品推荐

