在R中按指定列去重并选取另一列值最小对应行的实现方法
问题解答
1. distinct()的默认选取规则
dplyr的distinct()函数在遇到同个指定列对应多行时,默认保留该列唯一值第一次出现的对应行,没有内置自定义选取规则的参数,要实现按其他列取值筛选去重行的需求,需要搭配其他dplyr函数使用。
2. 实现按col1去重且取col2最小值行的方法
方法1:group_by() + slice_min()(推荐,dplyr 1.0.0及以上版本支持)
这是最直观的实现方式,按分组取指定列最小值的行:
library(dplyr) # 构造示例数据 df <- data.frame( col1 = c("a", "b", "a", "b", "a", "c", "a"), col2 = c(10, 12, 8, 14, 15, 6, 3) ) # 执行去重筛选 result <- df %>% group_by(col1) %>% slice_min(col2, n = 1) %>% ungroup()
如果同个col1下存在多个col2相同最小值的行,默认会全部返回,仅需保留1行的话可以加参数with_ties = FALSE。
方法2:arrange() + distinct() 兼容旧版本
利用distinct()默认保留首次出现行的规则,先按col1、col2升序排序,再对col1去重,参数.keep_all = TRUE用于保留所有列数据:
result <- df %>% arrange(col1, col2) %>% distinct(col1, .keep_all = TRUE)
两种方法输出结果均符合预期:
col1 col2 1 a 3 2 b 12 3 c 6
内容的提问来源于stack exchange,提问作者Daniil Khlebnikov
相关产品推荐
相关产品推荐

