我有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
也会没问题。
非常感谢!
答案 0 :(得分:3)
The idea is similar to this one。您可以使用pmin
和pmax
创建另外两列,按以下方式进行分组:
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