如何将R中2x4 tibble转换为4x4格式(指定布尔列为行)
R中tibble格式转换方案
你当前得到的2行4列tibble结构大致如下(模拟示例):
| have_kidney_disease | no_kidney_disease | mean_weight | sd_weight |
|---|---|---|---|
| TRUE | FALSE | 75.30 | 15.20 |
| FALSE | TRUE | 72.10 | 14.80 |
要转换成4行4列,保留have_kidney_disease和no_kidney_disease作为行属性,只需用tidyr::pivot_longer()函数将均值、标准差列拆分为行即可。直接修改代码如下:
library(tidyverse) # 生成原汇总表并赋值 summary_df <- BRFSS2015 %>% filter(!is.na(WTKG3), CHCKIDNY %in% 1:2) %>% mutate(have_kidney_disease = CHCKIDNY == 1, no_kidney_disease = CHCKIDNY == 2, weight = WTKG3) %>% group_by(have_kidney_disease, no_kidney_disease) %>% summarize(mean_weight = mean(weight), sd_weight = sd(weight), .groups = "drop") %>% mutate_if(is.numeric, round, digits=2) # 转换为目标格式 final_df <- summary_df %>% pivot_longer( cols = c(mean_weight, sd_weight), # 指定要转为行的指标列 names_to = "weight_stat", # 新增列,标记是均值还是标准差 values_to = "value" # 存储指标数值的列 )
转换后的final_df就是4行4列的结构,示例如下:
| have_kidney_disease | no_kidney_disease | weight_stat | value |
|---|---|---|---|
| TRUE | FALSE | mean_weight | 75.30 |
| TRUE | FALSE | sd_weight | 15.20 |
| FALSE | TRUE | mean_weight | 72.10 |
| FALSE | TRUE | sd_weight | 14.80 |
如果觉得have_kidney_disease和no_kidney_disease两列重复冗余,可以合并为一个状态列,让结果更简洁:
final_df <- summary_df %>% mutate(kidney_status = case_when( have_kidney_disease ~ "有肾病", no_kidney_disease ~ "无肾病" )) %>% select(-have_kidney_disease, -no_kidney_disease) %>% pivot_longer( cols = c(mean_weight, sd_weight), names_to = "weight_stat", values_to = "value" ) %>% relocate(kidney_status)
这个版本的结果结构:
| kidney_status | weight_stat | value |
|---|---|---|
| 有肾病 | mean_weight | 75.30 |
| 有肾病 | sd_weight | 15.20 |
| 无肾病 | mean_weight | 72.10 |
| 无肾病 | sd_weight | 14.80 |
内容的提问来源于stack exchange,提问作者jakdar
相关产品推荐
相关产品推荐

