如何用dplyr按值筛选反向配对数据,保留唯一实例?
问题需求
需要处理一组包含双向配对的数据(例如A01-B01和B01-A01视为同一配对),按以下规则保留每个配对的唯一实例:
- 优先保留
C列数值更高的行; - 若
C列数值相同,则保留A列字母顺序更靠前的行。
示例数据
A = c("A01", "A01", "B01", "B02", "C03", "B01") B = c("A02", "B01", "C03", "C03", "B01", "A01") C = c(3, 4, 5, 2, 5, 3) df <- tibble(A,B,C)
dplyr解决方案
核心思路是先为每个双向配对生成统一标识,再按规则筛选唯一实例:
library(dplyr) library(tibble) df %>% # 生成配对统一标识:将A、B按字母排序后合并,让A01-B01和B01-A01对应同一个key mutate(pair_key = pmap_chr(list(A, B), ~paste(sort(c(..1, ..2)), collapse = "-"))) %>% # 按配对分组,先按C降序排序,再按A升序排序,取每组第一行 group_by(pair_key) %>% arrange(desc(C), A) %>% slice(1) %>% # 移除临时生成的配对标识列 ungroup() %>% select(-pair_key)
输出结果
运行代码后得到符合要求的数据集:
# A tibble: 4 × 3 A B C <chr> <chr> <dbl> 1 A01 A02 3 2 A01 B01 4 3 B01 C03 5 4 B02 C03 2
内容的提问来源于stack exchange,提问作者PhDavey
相关产品推荐
相关产品推荐

