R语言按另一列条件处理重复行 不删除数据并重命名重复名称
R语言实现同分组按指定列排序后加序号后缀
方案1:tidyverse/dplyr实现(推荐,不改变原数据行顺序)
你可以直接基于dplyr的分组排名逻辑实现,无需打乱原数据的行顺序:
library(dplyr) data <- data %>% # 按名称分组 group_by(name) %>% # 分组内按nb_participants降序排名,NA值默认排最后,相同值按原出现顺序定先后 mutate(rank = rank(desc(nb_participants), na.last = TRUE, ties.method = "first")) %>% # 按你需要的格式拼接新名称 mutate(name = paste0(name, " 2-", rank)) %>% # 取消分组,删除临时排名列 ungroup() %>% select(-rank)
运行后输出结果和你给出的期望格式完全一致。
方案2:基础R实现
如果你不想加载第三方包,可以用基础R的split + lapply逻辑实现:
# 先把name转成字符型避免因子报错 data$name <- as.character(data$name) # 按name分组处理 data_processed <- do.call(rbind, lapply(split(data, data$name), function(df) { df$rank <- rank(desc(df$nb_participants), na.last = TRUE, ties.method = "first") df$name <- paste0(df$name, " 2-", df$rank) return(df[, setdiff(colnames(df), "rank")]) })) # 恢复原数据的行顺序(split会打乱原顺序,不需要的话可以去掉这行) data <- data_processed[as.character(1:nrow(data)), ]
参数说明
ties.method = "first":如果同一分组内出现相同的nb_participants取值,按数据原有行的先后顺序排名,避免出现小数排名na.last = TRUE:保证所有nb_participants为NA的行,序号排在分组的最后
内容的提问来源于stack exchange,提问作者Coralie
相关产品推荐
相关产品推荐

