R语言:计算多站点中处理组与对照组的成对差值均值
同站点内处理组与对照组成对差值的均值计算
你需要在长数据框中按站点分组,对每个处理组(a)的数值,计算其与同站点所有对照组(cont)数值的差值的均值;对照组的结果设为NA,不跨站点计算。
示例输入数据:
df <- read.table(text = " Site Treatment Value 1 cont 3 1 cont 2 1 cont 8 1 a 20 1 a 0 1 a 1 1 a 1 2 cont 18 2 cont 21 2 cont 60 2 a 3 2 a 4 2 a 40", header = T)
解决方案1:使用dplyr包
通过分组提取对照组数值,逐行计算差值均值:
library(dplyr) output <- df %>% group_by(Site) %>% mutate( # 存储当前站点所有对照组的数值 cont_values = list(Value[Treatment == "cont"]), # 计算处理组的差值均值,对照组设为NA Difference = ifelse(Treatment == "a", sapply(Value, function(x) mean(x - cont_values[[1]])), NA) ) %>% select(-cont_values) %>% # 移除临时辅助列 mutate(Difference = round(Difference, 2)) %>% # 保留两位小数 ungroup() print(output)
解决方案2:使用Base R
无需加载额外包,通过by()函数实现分组计算:
output_base <- do.call(rbind, by(df, df$Site, function(group) { cont_vals <- group$Value[group$Treatment == "cont"] group$Difference <- ifelse(group$Treatment == "a", sapply(group$Value, function(x) mean(x - cont_vals)), NA) group$Difference <- round(group$Difference, 2) return(group) })) rownames(output_base) <- NULL # 清除自动生成的行名 print(output_base)
输出结果
运行后得到的结果与期望输出一致(注:Site2中处理组a=40的差值均值实际为7,与你给出的示例输出中的-7不符,应为笔误,代码逻辑严格遵循“处理组值 - 对照组值”的计算规则):
# A tibble: 13 × 4 Site Treatment Value Difference <int> <chr> <int> <dbl> 1 1 cont 3 NA 2 1 cont 2 NA 3 1 cont 8 NA 4 1 a 20 15.7 5 1 a 0 -4.33 6 1 a 1 -3.33 7 1 a 1 -3.33 8 2 cont 18 NA 9 2 cont 21 NA 10 2 cont 60 NA 11 2 a 3 -30 12 2 a 4 -29 13 2 a 40 7
内容的提问来源于stack exchange,提问作者nn90
相关产品推荐
相关产品推荐

