将DataFrame中Gender与Stress字段编码转换并生成百分比交叉表
处理因子变量并生成性别与压力的百分比交叉表
步骤1:转换因子变量为目标数值型
你的数据里Gender和Stress都是因子类型,按照要求做映射转换:
Gender:原水平"0"对应0(Female),"1"对应1(Male)Stress:原水平"No"对应0,"Yes"对应1
Base R 实现
# 转换Gender:先转字符再转数值,避免因子水平索引干扰 df$Gender <- as.numeric(as.character(df$Gender)) # 转换Stress:利用因子默认顺序,as.numeric返回1对应"No"、2对应"Yes",减1得到0/1 df$Stress <- as.numeric(df$Stress) - 1
dplyr 实现(更直观)
library(dplyr) df <- df %>% mutate( Gender = case_when( Gender == "0" ~ 0, Gender == "1" ~ 1 ), Stress = case_when( Stress == "No" ~ 0, Stress == "Yes" ~ 1 ) )
步骤2:生成百分比交叉表
我们生成按性别分组的压力分布百分比(即每个性别中,有/无压力的占比):
Base R 实现
# 生成原始频数交叉表 freq_tab <- table(Gender = df$Gender, Stress = df$Stress) # 转换为行百分比(每行总和为100%) pct_tab <- prop.table(freq_tab, margin = 1) * 100 # 重命名行列让结果更易读 dimnames(pct_tab) <- list( Gender = c("Female(0)", "Male(1)"), Stress = c("No(0)", "Yes(1)") ) # 查看结果 print(pct_tab)
dplyr + janitor 实现(更美观)
如果需要同时显示频数和格式化百分比,推荐用janitor包:
library(janitor) df %>% # 把数值转成文字标签提升可读性 mutate( Gender = ifelse(Gender == 0, "Female", "Male"), Stress = ifelse(Stress == 0, "No", "Yes") ) %>% tabyl(Gender, Stress) %>% # 生成基础交叉表 adorn_percentages("row") %>% # 计算行百分比 adorn_pct_formatting(digits = 1) %>% # 格式化百分比(保留1位小数) adorn_ns() # 添加原始频数
运行后会得到类似这样的格式化结果:
Gender No Yes Female 60.0% (3) 40.0% (2) Male 33.3% (1) 66.7% (2)
内容的提问来源于stack exchange,提问作者EBE
相关产品推荐
相关产品推荐

