如何用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
相关产品推荐
相关产品推荐

