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

在R中使用group_by()按双因子变量统计时如何处理NA值

按区域统计植食性事件数量(含NA处理)

问题背景

我有数据框df1,包含区域(Region)、站点(Site)和植食性类型(Herbivory_type)字段,无植食性时该字段为NA:

df1 <- data.frame(Region=c("ALI1","ALI1","ALI1","ALI1","ALI2","ALI2","ALI2","ALI3","ALI3","ALI3","ALI3","ALI5","ALI5"),
                  Site=c("ALI1_A","ALI1_B","ALI1_C","ALI1_D","ALI2_A","ALI2_B","ALI2_C","ALI3_A","ALI3_B","ALI3_C","ALI3_D","ALI5_A","ALI5_B"),
                  Herbivory_type=c(NA,"S",NA,NA,NA,NA,NA,NA,"S","S",NA,NA,"S"))

df1$Herbivory_type <- as.factor(df1$Herbivory_type)

需要按Region统计植食性事件(类型为"S")的数量,全为NA的区域统计值为0,期望结果如下:

# df2
   Region N_Hervivory_S
1   ALI1             1
2   ALI2             0
3   ALI3             2
4   ALI5             1

尝试了以下代码,但输出不符合预期:

as.data.frame(df1 %>% group_by(Region,Herbivory_type) %>% summarise(N = n()))

错误输出:

Region Herbivory_type N
1   ALI1              S 1
2   ALI1           <NA> 3
3   ALI2           <NA> 3
4   ALI3              S 2
5   ALI3           <NA> 2
6   ALI5              S 1
7   ALI5           <NA> 1

解决方案

方法1:使用dplyr分组统计

直接按Region分组,统计每个区域中Herbivory_type等于"S"的行数,na.rm = TRUE会忽略NA值,全为NA的区域统计结果自动为0:

library(dplyr)

df2 <- df1 %>%
  group_by(Region) %>%
  summarise(N_Hervivory_S = sum(Herbivory_type == "S", na.rm = TRUE)) %>%
  ungroup()

# 查看结果
df2

方法2:基础R实现

使用table生成交叉统计表,提取类型为"S"的计数并整理成目标格式:

# 生成区域与植食性类型的交叉计数表
count_table <- table(df1$Region, df1$Herbivory_type)

# 提取"S"类型的计数,转换为数据框
df2 <- as.data.frame(count_table[, "S", drop = FALSE])
colnames(df2) <- "N_Hervivory_S"

# 添加Region列并调整顺序
df2$Region <- rownames(df2)
df2 <- df2[, c("Region", "N_Hervivory_S")]
rownames(df2) <- NULL

# 查看结果
df2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:45:38