You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中纳入重复样本缺失因子水平以计算均值与标准误

解决生境占比按站点汇总时缺失值补0的问题

现有数据框df,包含站点(Site)、重复样本(Replica)、生境(Habitat)及对应占比(Porcentage),示例数据如下:

df <- data.frame(Site = c("A","A","A","A","A","B","B","B","B","B","B"),
                 Replica = c(1,1,1,2,2,1,1,1,2,2,2),
                 Habitat = c("X","Y","Z","X","Y","X","Y","M","X","M","Z"),
                 Porcentage = c(46,38,16,40,60,20,60,20,35,55,10))

每个站点内单个重复样本的所有生境占比之和为100。需要按站点计算各生境的平均占比(Mean_Porcentage)及均值标准误(SE),但直接分组汇总的结果未将缺失的生境按0计算,导致均值和标准误不准确:

library(dplyr)

df %>% 
  group_by(Site,Habitat) %>% 
  summarise(Mean_Porcentage = mean(Porcentage),
            SE = sd(Porcentage)/sqrt(length(Porcentage)))

输出结果:

# A tibble: 7 × 4
# Groups:   Site [2]
  Site  Habitat Mean_Porcentage    SE
  <chr> <chr>             <dbl> <dbl>
1 A     X                  43     3  
2 A     Y                  49    11  
3 A     Z                  16    NA  
4 B     M                  37.5  17.5
5 B     X                  27.5   7.5
6 B     Y                  60    NA  
7 B     Z                  10    NA 

例如站点A的生境Z在Replica=2中缺失,应按0计算,均值应为8、SE为8;站点A中未出现的生境M也需显示均值为0。期望结果如下:

Site Habitat Mean_Porcentage     SE
1    A       M             0.0      0
2    A       X            43.0      3
3    A       Y            49.0     11
4    A       Z             8.0      8
5    B       M            37.5   17.5
6    B       X            27.5    7.5
7    B       Y            30.0     30
8    B       Z             5.0      5

解决方案

核心思路是先构建每个站点-重复样本下所有生境的完整组合,将缺失的生境占比补0后再进行统计:

library(dplyr)
library(tidyr)

# 获取所有出现过的生境类型
all_habitats <- unique(df$Habitat)

# 构建完整的站点-重复样本-生境组合,补全缺失值为0后计算统计量
df_result <- df %>%
  # 按站点分组,生成每个站点下所有重复样本与所有生境的笛卡尔积
  group_by(Site) %>%
  expand(Replica, Habitat = all_habitats) %>%
  # 左连接原数据,将缺失的占比替换为0
  left_join(df, by = c("Site", "Replica", "Habitat")) %>%
  replace_na(list(Porcentage = 0)) %>%
  # 按站点和生境分组计算均值和标准误
  group_by(Site, Habitat) %>%
  summarise(
    Mean_Porcentage = mean(Porcentage),
    # 处理所有值为0的情况,避免sd返回NA,此时SE为0
    SE = ifelse(all(Porcentage == 0), 0, sd(Porcentage)/sqrt(n()))
  ) %>%
  ungroup()

# 查看结果
df_result

执行后即可得到符合预期的输出。

内容的提问来源于stack exchange,提问作者Dekike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:35:14