如何按dataset分组统计治疗类型数量并添加至df2数据框
按Dataset统计治疗类型并合并到汇总数据框的R实现
方法一:Base R 实现
从全量数据df1中按dataset分组统计目标治疗类型的样本数,再与汇总数据框df2合并:
# 统计各dataset下的治疗类型计数 treatment_counts <- as.data.frame.matrix(xtabs(~ dataset + treatment, data = df1)) # 筛选出需要的4种治疗类型列 target_treatments <- c("Treatment1", "Treatment2", "Treatment3", "Treatment1 + Treatment3") treatment_counts <- treatment_counts[, target_treatments, drop = FALSE] # 与df2合并,保留df2所有行 df2 <- merge(df2, treatment_counts, by = "dataset", all.x = TRUE) # 将缺失值(无对应治疗的dataset)替换为0 df2[is.na(df2)] <- 0
方法二:dplyr + tidyr 实现
用tidyverse语法更直观地完成统计与合并:
library(dplyr) library(tidyr) # 分组统计目标治疗类型的样本数 treatment_summary <- df1 %>% group_by(dataset, treatment) %>% summarise(count = n(), .groups = "drop") %>% filter(treatment %in% target_treatments) %>% pivot_wider( names_from = treatment, values_from = count, values_fill = 0 # 无对应治疗的自动填充0 ) # 合并到df2 df2 <- df2 %>% left_join(treatment_summary, by = "dataset")
特殊情况处理
如果df1的treatment字段不是直接的目标4种类型(比如是多治疗组合的字符串,如"Treatment1,Treatment3"),需先转换分类:
df1 <- df1 %>% mutate( treatment_group = case_when( treatment == "Treatment1" ~ "Treatment1", treatment == "Treatment2" ~ "Treatment2", treatment == "Treatment3" ~ "Treatment3", grepl("Treatment1", treatment) & grepl("Treatment3", treatment) ~ "Treatment1 + Treatment3", TRUE ~ NA_character_ # 其他类型标记为缺失,后续会被过滤 ) ) # 之后将上述代码中的`treatment`替换为`treatment_group`即可
内容的提问来源于stack exchange,提问作者Kev
相关产品推荐
相关产品推荐

