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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 07:48:03