在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
相关产品推荐
相关产品推荐

