检测前两列中具有相同数字组合的行,并选择第三列中编号最大的行

时间:2013-03-19 09:35:33

标签: r postgresql dataframe

我有data.frame只有三列,但有几千行。第一列和第二列报告数字ID,它们的组合表示链接(例如A-B等于B-A)。

现在,我想删除链接重复的所有行,选择第三列中值最高的行。

下面是一个简短的例子:

我的输入data.frame

1   2    100
102 100  20000
100 102  23131
10  19 124444
10  15   1244
19  10   1242
10  19   5635
2   1    666
1   2     33
100 110     23

我的目标是:

100 102  23131
10  19 124444
10  15   1244
2   1    666
100 110     23

我想在R中找到解决方案,否则postgreSQL也会没问题。 非常感谢!

4 个答案:

答案 0 :(得分:3)

The idea is similar to this one。您可以使用pminpmax创建另外两列,按以下方式进行分组:

data.table解决方案。但是如果你不想要data.table,那么你仍然可以使用这个想法。但是,使用R代码获得比data.table解决方案更快的速度是不可能的。

# assuming your data.frame is DF
require(data.table)
DT <- data.table(DF)
# get min of V1,V2 on one column and max on other (for grouping)
DT[, `:=`(id1=pmin(V1, V2), id2=pmax(V1, V2))]
# get max of V3
DT.OUT <- DT[, .SD[which.max(V3), ], by=list(id1, id2)]
# remove the id1 and id2 columns
DT.OUT[, c("id1", "id2") := NULL]

#     V1  V2     V3
# 1:   2   1    666
# 2: 100 102  23131
# 3:  10  19 124444
# 4:  10  15   1244
# 5: 100 110     23

答案 1 :(得分:2)

这是基础R中的一个选项,主要用于共享替代方案。由于它涉及转置和排序,实际上,您的“数千行”数据集可能会很慢。假设您的data.frame被称为“mydf”:

myAggs <- as.data.frame(t(apply(mydf[1:2], 1, sort)))
mydf[1:2] <- myAggs
aggregate(V3 ~ ., mydf, max)
#    V1  V2     V3
# 1   1   2    666
# 2  10  15   1244
# 3  10  19 124444
# 4 100 102  23131
# 5 100 110     23

答案 2 :(得分:1)

在postgresql ..

如果您的原始表是用三列整数构建的 - a,b,c - 那么您可以使用条件函数来建立max(a,b),min(a,b)的唯一键:

select 
 case when a>=b then a else b end as key1, 
 case when a>=b then b else a end as key2,  
 c from table;

然后您可以使用'group'获取每个键(key1,key2)的最大C:

select 
 key1, 
 key2, 
 max(c) as max_c 
 from (
  select 
  case when a>=b then a else b end as key1, 
  case when a>=b then b else a end as key2,  
  c from table
 ) query
 group by key1, key2;

答案 3 :(得分:1)

PostgreSQL的:

select distinct on (1, 2)
    least(a, b), greatest(a, b), c
from data_frame
order by 1, 2, c desc