在R中实现多变量生态数据(站点×物种矩阵)的统一过滤方法
多变量生态学Site×Species矩阵数据处理方案
先加载你的数据集:
df <- structure(list(Site = c("A", "B", "C", "D", "E", "F", "G", "H", "I"), X1= c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 3L), X2 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 10L, 0L), X3 = c(0L, 0L, 0L, 0L, 0L, 3L, 6L, 0L, 0L), X4 = c(0L, 9L, 4L, 1L, 8L, 6L, 0L, 0L, 0L), X5 = c(6L, 5L, 2L, 5L, 1L, 5L, 2L, 0L, 0L)), class = "data.frame", row.names = c(NA, -9L))
一、列筛选(移除指定列,同时保留被移除数据)
1. 标记需移除的列
针对物种列(排除Site列)计算筛选条件:
# 提取所有物种列 species_cols <- df[, -1] # 条件1:仅含1个非零值的列 col_single_nonzero <- colSums(species_cols != 0) == 1 # 条件2:列总和小于6的列 col_sum_less6 <- colSums(species_cols) < 6 # 合并条件,得到需移除的列名 cols_to_remove <- names(species_cols)[col_single_nonzero | col_sum_less6]
2. 提取被移除的列生成独立数据框
removed_cols_df <- df[, c("Site", cols_to_remove)]
3. 保留符合要求的列
df_filtered_cols <- df[, !names(df) %in% cols_to_remove]
二、行筛选(基于列筛选结果,移除指定行并保留被移除数据)
1. 标记需移除的行
基于筛选后的列,计算每行的筛选条件:
# 条件1:仅含1个非零值的行 row_single_nonzero <- rowSums(df_filtered_cols[, -1] != 0) == 1 # 条件2:行总和小于10的行 row_sum_less10 <- rowSums(df_filtered_cols[, -1]) < 10 # 合并条件,得到需移除的行索引 rows_to_remove <- rownames(df_filtered_cols)[row_single_nonzero | row_sum_less10]
2. 提取被移除的行生成独立数据框
removed_rows_df <- df_filtered_cols[row_single_nonzero | row_sum_less10, ]
3. 得到最终符合所有要求的数据框
df_final <- df_filtered_cols[!(row_single_nonzero | row_sum_less10), ]
结果说明
removed_cols_df:存储被移除的列(X1、X2)及对应站点信息removed_rows_df:存储被移除的行(站点A、C、D、E、G、H、I)及对应筛选后列信息df_final:最终保留的有效数据,包含站点B、F,物种列X3、X4、X5
内容的提问来源于stack exchange,提问作者ecology
相关产品推荐
相关产品推荐

