2

data.frame列は 3 つしかありませんが、何千もの行があります。最初と 2 番目の列は数値 ID を報告し、それらの組み合わせはリンクを示します (たとえば、AB は BA に等しい)。

ここで、リンクの重複しているすべての行を削除し、3 番目の列の値が最も高い行を選択したいと思います。

以下に短い例を示します。

私の入力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

4 に答える 4

3

考え方はこれと似ています。次のように to グループをpmin、2 つの追加の列を作成できます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
于 2013-03-19T09:44:13.597 に答える
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
于 2013-03-19T09:56:58.450 に答える
1

postgresqlで..

元のテーブルが整数の 3 つの列 (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;
于 2013-03-19T09:59:14.287 に答える
1

Postgresql:

select distinct on (1, 2)
    least(a, b), greatest(a, b), c
from data_frame
order by 1, 2, c desc
于 2013-03-26T14:14:12.890 に答える