R语言data.frame中合并重复物种列并删除冗余列的实现方法
实现方法
方法1:tidyverse 方案(代码可读性高)
library(tidyverse) # 你的示例数据 df <- structure(list(TargetFID = c(89L, 90L, 91L, 136L, 137L, 150L), Cephaloscyllium.cooki = c(0L, 0L, 0L, 0L, 0L, 0L), Cephaloscyllium.fasciatum = c(1L, 0L, 0L, 0L, 0L, 0L), Cephaloscyllium.fasciatum.1 = c(0, 0, 1L, 0, 0, 0), Cephaloscyllium.hiscosellum = c(0L, 0L, 0L, 0L, 0L, 0L)), row.names = c(NA, 6L), class = "data.frame") # 合并重复物种列 df_merged <- df %>% reframe( TargetFID = TargetFID, # 提取所有唯一物种名(去掉末尾.1/.2这类重复后缀) across(all_of(unique(str_remove(names(df)[-1], "\\.\\d+$"))), # 对同一物种的所有列按行求和,超过1的统一转成1(保证是存在/缺失的0/1格式) ~ pmin(rowSums(pick(ends_with(.x))), 1)) )
输出结果和你给出的预期完全一致。
方法2:base R 方案(无需加载第三方包)
# 提取物种列的分组名(移除末尾的.数字后缀) species_groups <- sub("\\.\\d+$", "", names(df)[-1]) # 按物种分组合并列,按行求和后转0/1 merged_cols <- lapply(split.default(df[, -1], species_groups), function(x) pmin(rowSums(x), 1)) # 合并ID列和处理后的物种列,调整列顺序和原始顺序一致 df_merged <- cbind(df["TargetFID"], as.data.frame(merged_cols))[, c("TargetFID", unique(species_groups))]
注意说明
- 正则规则
\\.\\d+$只会匹配列名末尾的.数字格式后缀,不会误改物种名本身自带的点分隔符。 - 两种方案都支持任意数量的重复列(不管是2个还是3个重复列都可以自动合并),完全适配你的1054列大数据框场景。
pmin(..., 1)的作用是避免同一网格同一物种多个重复列都取1时,求和得到大于1的结果,保证最终输出还是标准的0/1存在缺失格式。
内容的提问来源于stack exchange,提问作者Jam
相关产品推荐
相关产品推荐

