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

如何用R语言按列出现次数筛选Data Frame:保留超4样地物种

筛选出现次数超过4个样地的物种

咱们先理清楚你的需求:你有一个记录样地和物种数量的Data Frame,想要提取出**在超过4个样地中出现(即非零值数量>4)**的物种,同时保留样地编号列对吧?

首先先确认你的原始数据框代码:

df <- data.frame(
  plot = c(1, 2, 3, 4, 5, 6, 7, 8, 9),
  speciesA = c(5, 0, 10, 0, 8, 45, 0, 0, 17),
  speciesB = c(0, 0, 0, 0, 0, 0, 0, 0, 0),
  speciesC = c(0.7, 0, 17, 0, 0, 8, 0, 9, 0),
  speciesD = c(1, 0, 0, 3, 0, 0, 0, 9, 1)
)

你原来代码的问题

你用colSums(df != 0)统计非零次数的思路是对的,但后面的筛选代码df[,which(apply(df,2,colSums)> 4)]有两个问题:

  1. apply(df,2,colSums)完全没必要——colSums本身就是按列求和的函数,apply把每一列单独传给colSums,得到的是每列的数值总和,而不是非零值的数量;
  2. 没有排除plot列——样地编号不是物种,统计的时候不该把它算进去。

正确的解决方法

我们可以分两步来做,或者一步到位:

方法1:分步清晰版

  1. 先计算每个物种的非零样地数(跳过plot列):
# 统计除plot外每列的非零值数量
species_occur <- colSums(df[-1] != 0)
species_occur
# 输出结果:speciesA speciesB speciesC speciesD 
#               5        0        4        4
  1. 筛选出符合条件(非零次数>4)的物种,再把plot列加回来:
# 提取符合条件的物种名
selected_species <- names(species_occur[species_occur > 4])
# 构建新的Data Frame
df2 <- df[, c("plot", selected_species)]

方法2:一步简洁版

直接用逻辑向量筛选列,第一列(plot)强制保留,后面的列判断是否满足非零次数>4:

df2 <- df[, c(TRUE, colSums(df[-1] != 0) > 4)]

两种方法得到的df2都会保留plot列和speciesA列(因为它在5个样地中出现,满足>4的条件),其他物种都会被过滤掉。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:16:25