求R语言从data.frame生成含绝对/累计绝对/相对/累计相对频数的频数表命令
在R语言中生成包含各类频数的频数表
问题分析
你当前的代码存在语法错误:创建data.frame时,不能直接用<-定义列,而且此时prova还未生成,无法引用prova$Freq.ass。另外,epiDisplay的tab1函数更适合从原始观测数据生成频数表,而非从已汇总的频数数据操作。
解决方案
情况1:从已汇总绝对频数的data.frame生成完整频数表
如果你已经有类别列和绝对频数列,可按以下步骤生成所有所需列:
# 创建基础数据框(注意正确语法,不用<-定义列) prova <- data.frame( Variabile = c("A", "B", "C", "D", "E"), Freq.ass = c(1, 3, 7, 10, 17), stringsAsFactors = FALSE ) # 计算累计绝对频数 prova$Cum.Abs.freq <- cumsum(prova$Freq.ass) # 计算相对频数(保留2位小数) prova$Rel.freq <- round(prova$Freq.ass / sum(prova$Freq.ass), 2) # 计算累计相对频数 prova$Cum.Rel.freq <- cumsum(prova$Rel.freq) # 重命名列到目标名称 colnames(prova) <- c("类别", "绝对频数", "累计绝对频数", "相对频数", "累计相对频数") # 查看结果 print(prova)
运行后输出:
类别 绝对频数 累计绝对频数 相对频数 累计相对频数 1 A 1 1 0.02 0.02 2 B 3 4 0.06 0.08 3 C 7 11 0.14 0.22 4 D 10 21 0.20 0.42 5 E 17 38 0.35 0.77
注:累计相对频数最后一行不是1是因为四舍五入,若需精确值,可去掉round再计算累计
情况2:从原始观测数据生成频数表
如果你的数据是原始观测记录(每行对应一个样本),可选择以下两种方法:
方法1:使用基础R
# 模拟原始数据 raw_data <- data.frame( Variabile = sample(c("A", "B", "C", "D", "E"), 100, replace = TRUE) ) # 计算绝对频数 abs_freq <- table(raw_data$Variabile) # 累计绝对频数 cum_abs_freq <- cumsum(abs_freq) # 相对频数 rel_freq <- round(prop.table(abs_freq), 2) # 累计相对频数 cum_rel_freq <- cumsum(rel_freq) # 合并成数据框 freq_table <- data.frame( 类别 = names(abs_freq), 绝对频数 = as.numeric(abs_freq), 累计绝对频数 = as.numeric(cum_abs_freq), 相对频数 = as.numeric(rel_freq), 累计相对频数 = as.numeric(cum_rel_freq) ) print(freq_table)
方法2:使用epiDisplay包
# 仅第一次运行时安装 # install.packages("epiDisplay") library(epiDisplay) # 直接生成带累计统计的频数表 tab1(raw_data$Variabile, sort.group = FALSE, cum.percent = TRUE)
该函数会直接输出包含绝对频数、相对频数、累计绝对频数、累计相对频数的表格,无需手动计算。
内容的提问来源于stack exchange,提问作者Giuseppe De Pinto
相关产品推荐
相关产品推荐

