在R中如何按两列分组匹配,将组内id值替换为最小no对应的id值
实现方案
测试数据构造
你可以直接用以下代码读取你的示例数据到R环境中:
df <- read.table(text = " no name city id 1301 Lee A 1301-1 1001 Lee A 1001-2 1201 Lee A 1201-4 1402 Sam B 1402-4 1622 Sam C 1622-5 ", header = TRUE, stringsAsFactors = FALSE)
方法1:使用dplyr包(推荐,代码易读)
# 加载依赖包,未安装的话先运行 install.packages("dplyr") library(dplyr) res <- df %>% # 按name、city两列分组 group_by(name, city) %>% # 组内id统一替换为no最小值对应的id值 mutate(id = id[which.min(no)]) %>% # 取消分组避免后续操作受分组属性影响 ungroup()
运行后输出结果和你的预期完全一致:
# A tibble: 5 × 4 no name city id <int> <chr> <chr> <chr> 1 1301 Lee A 1001-2 2 1001 Lee A 1001-2 3 1201 Lee A 1001-2 4 1402 Sam B 1402-4 5 1622 Sam C 1622-5
方法2:Base R实现(无需安装第三方包)
df$id <- ave(seq(nrow(df)), df$name, df$city, FUN = function(idx) { df$id[idx][which.min(df$no[idx])] })
内容的提问来源于stack exchange,提问作者Feixiang Sun
相关产品推荐
相关产品推荐

