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

如何用R语言将同一id组内的scientific_name统一替换为首个值?

问题描述

我有如下R数据框:

same_id <- data.frame(scientific_name = c("ABIES BIFOLIA", 
"ABIES LASIOCARPA", "ABIES LASIOCARPA", "ABIES MENZIESII", "PINUS LASIOCARPA"),
                      id = c(1, 1, 1, 2, 1),
                      cover = c(80, 60, 20, 10, 20))

数据结构如下:

scientific_name id cover
1    ABIES BIFOLIA  1    80
2 ABIES LASIOCARPA  1    60
3 ABIES LASIOCARPA  1    20
4  ABIES MENZIESII  2    10
5 PINUS LASIOCARPA  1    20

需求:当同一个id对应多个不同的scientific_name时,将该id组内所有的scientific_name替换为组内的第一个值,其他字段保持不变。期望得到如下结果:

scientific_name id cover
1    ABIES BIFOLIA  1    80
2    ABIES BIFOLIA  1    60
3    ABIES BIFOLIA  1    20
4  ABIES MENZIESII  2    10
5    ABIES BIFOLIA  1    20

解决方案

方法1:基础R实现

用ave()函数按id分组处理,判断组内是否存在多个不同名称,满足条件则统一替换为组内第一个值:

same_id$scientific_name <- ave(
  same_id$scientific_name,
  same_id$id,
  FUN = function(x) {
    if (length(unique(x)) > 1) rep(x[1], length(x)) else x
  }
)

方法2:tidyverse(dplyr)实现

分组逻辑更直观,适合熟悉tidyverse生态的用户:

library(dplyr)

same_id <- same_id %>%
  group_by(id) %>%
  mutate(
    scientific_name = if_else(n_distinct(scientific_name) > 1, first(scientific_name), scientific_name)
  ) %>%
  ungroup()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:05:21