首页 > 解决方案 > 在 R 中,如何删除基于两列的重复项,其值可能是可交换的?

问题描述

我的样本数据是:

a <- data.frame(a1=c('a','b','c','d','e'),
                a2=c('b','a','d','c','f'),
                a3=c(0.1,0.3,0.5,0.1,1))

我想要做的是合并列 a1 和 a2,并同时对字符串进行排序。因此,数据应更改为:

  a1 a2  a3  a12
1  a  b 0.1  a,b
2  b  a 0.3  a,b
3  c  d 0.5  c,d
4  d  c 0.1  c,d
5  e  f 1.0  e,f

排序后,我们可以看到第 1 行和第 2 行实际上在一个组中,第 3 和第 4 行也是如此。然后对于每一组,我只想保留 a3 最大的行。所以,最后,数据应该是这样的:

  a1 a2  a3  a12
2  b  a 0.3  a,b
3  c  d 0.5  c,d
5  e  f 1.0  e,f

我坚持如何对a1和a2进行排序。有什么快速的方法可以做到这一点吗?

标签: rdataframesortinggroup-byduplicates

解决方案


您可以使用sortand pasteinapply来获取a12. 然后用于which.max获取a3最大值所在的行并返回它。

a$a12 <- apply(a[1:2], 1, function(x) paste(sort(x), collapse=","))
do.call(rbind, lapply(split(a, a$a12), function(x) x[which.max(x$a3),]))
#    a1 a2  a3 a12
#a,b  b  a 0.3 a,b
#c,d  c  d 0.5 c,d
#e,f  e  f 1.0 e,f

推荐阅读