-1

航空会社のフライト データがあるとします。1 つのフィールドは出発空港で、もう 1 つのフィールドは目的地空港です。ルートごとに観測をグループ化したいと思います (独自の出発地と目的地の組み合わせ)。問題は、一意のルートごとに、対応するリターン ルートも含める必要があることです。たとえば、ある一連の観測で空港 A から空港 B があったが、次の数回の観測で空港 B から空港 A に移動した場合、それらすべてに同じルート ID を持たせたいと思います。

これには、SAS、Stata、または R を使用できます。それがより簡単であれば、Pythonでさえ。

以下の代表者コード:

df1 <- structure(list(airl = c("US", "US", "US", "US", "US", "US", "US", 
"US", "US", "US", "US", "US", "US", "US", "US", "US", "US", "US", 
"US", "US", "US", "US", "US", "US", "US", "US", "US", "US", "US", 
"US", "US", "US", "US", "US", "US", "US", "US", "US", "US", "US", 
"US", "US", "US", "US", "US", "US", "US", "US", "US", "US", "US", 
"US", "US", "US", "US", "US", "US", "US", "US", "US", "US", "US", 
"US", "US", "US", "US", "US", "US", "US"), ORIGIN = c("ABE", 
"ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", 
"ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", 
"ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", 
"ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "CLT", "CLT", "CLT", 
"CLT", "CLT", "CLT", "CLT", "CLT", "CLT", "CLT", "CLT", "CLT", 
"CLT", "CLT", "CLT", "CLT", "CLT", "CLT", "PHL", "PHL", "PHL", 
"PHL", "PHL", "PHL", "PHL", "PHL", "PHL", "PHL", "PHL", "PHL", 
"PHL", "PHL", "PHL", "PHL", "PHL"), DESTINATION = c("CLT", "CLT", 
"CLT", "CLT", "CLT", "CLT", "CLT", "CLT", "CLT", "CLT", "CLT", 
"CLT", "CLT", "CLT", "CLT", "CLT", "CLT", "PHL", "PHL", "PHL", 
"PHL", "PHL", "PHL", "PHL", "PHL", "PHL", "PHL", "PHL", "PHL", 
"PHL", "PHL", "PHL", "PHL", "PHL", "ABE", "ABE", "ABE", "ABE", 
"ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", 
"ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", 
"ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", "ABE", 
"ABE", "ABE", "ABE", "ABE"), miles = c(480, 480, 480, 480, 480, 
480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 54, 
54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 
480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 
480, 480, 480, 480, 480, 54, 54, 54, 54, 54, 54, 54, 54, 54, 
54, 54, 54, 54, 54, 54, 54, 54), orig_area = c(23, 23, 23, 23, 
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 36, 36, 
36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 
23), dest_area = c(36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 
36, 36, 36, 36, 36, 36, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 
23, 23, 23, 23, 23, 23, 23, 23, 23, 23), month = c(1, 2, 3, 4, 
5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 10, 
11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 1, 2, 3, 4, 5, 6, 
7, 8, 9, 10, 11, 12, 1, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
1, 2, 3, 4, 5, 6, 7), freq = c(88, 80, 89, 78, 88, 83, 85, 80, 
76, 79, 76, 81, 86, 65, 62, 60, 82, 137, 138, 142, 144, 149, 
147, 150, 143, 150, 138, 128, 151, 145, 148, 146, 147, 149, 79, 
76, 81, 86, 65, 62, 60, 82, 82, 82, 84, 81, 83, 81, 85, 84, 76, 
85, 143, 137, 138, 142, 143, 151, 147, 150, 143, 150, 137, 128, 
151, 145, 148, 146, 147), seats = c(8146, 7352, 7599, 6920, 6759, 
6060, 6189, 5939, 6137, 6504, 6440, 6804, 6862, 5330, 5242, 5068, 
6204, 6460, 6276, 6047, 6095, 6306, 6102, 6265, 7085, 7344, 6809, 
6348, 6965, 6626, 6893, 6741, 6765, 6865, 6504, 6440, 6804, 6862, 
5330, 5242, 5068, 6204, 6104, 6030, 6278, 6034, 6944, 6816, 6544, 
6494, 5872, 6544, 6747, 6460, 6276, 6034, 6058, 6380, 6102, 6278, 
7085, 7344, 6759, 6348, 6952, 6613, 6919, 6728, 6765), year = c(2009, 
2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 2009, 
2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 
2010, 2010, 2010, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 
2009, 2009, 2009, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 
2010, 2010, 2010, 2010, 2011, 2011, 2011, 2010, 2010, 2010, 2010, 
2010, 2010, 2010, 2010, 2010, 2010, 2011, 2011, 2011, 2011, 2011, 
2011, 2011)), .Names = c("airl", "ORIGIN", "DESTINATION", "miles", 
"orig_area", "dest_area", "month", "freq", "seats", "year"), class = "data.frame", row.names = c(NA, 
69L))
4

4 に答える 4

2

最も単純なラベリング (出発地と目的地が問題にならないように、アルファベット順にリストされた 2 つの空港コード) を使用します。

df1$group <- apply(df1[c("ORIGIN", "DESTINATION")], 
                   1, 
                   function(cit) {paste(sort(cit),collapse="-")})

簡単に言うと、空港コードだけを取り出し、各行でコードをアルファベット順に並べ替えてから、ハイフンで区切って貼り付けます。groupそれを変数に割り当てます。

> df1$group
 [1] "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT"
 [8] "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT"
[15] "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL"
[22] "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL"
[29] "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-CLT"
[36] "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT"
[43] "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-CLT"
[50] "ABE-CLT" "ABE-CLT" "ABE-CLT" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL"
[57] "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL"
[64] "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL" "ABE-PHL"
于 2012-09-28T20:18:59.123 に答える
1

Stataでは、文字列間の関係を利用できます。

assert "ABE"<"CLT"

もちろん大丈夫ですが

assert "ABE"<"CLT"
assert "ABE"<1

エラーが発生します(最初のエラーはfalseで、2番目のエラーは互換性のないデータ型を比較しています)。したがって、Rでのブライアンの提案を反映して、

gen str7 route = origin + "-" + destination if origin < destination & !missing(origin) & !missing(destination)
replace  route = destination + "-" + origin if destination < origin & !missing(origin) & !missing(destination)
list origin destination route if missing( route )

もちろん、不足している値のチェックはすべて単なる妄想です。しかし、あなたのデータがどれほど悪いか誰が知っていますか:)。

于 2012-09-28T22:14:56.613 に答える
1

Randを使用するアプローチdata.table(コーディングのエレガンスとメモリ効率のため)

library(data.table)
DT <- as.data.table(df1)


DT[, id := paste(sort(c(ORIGIN, DESTINATION)), collapse ='-') ,
      by = list(ORIGIN, DESTINATION)]
于 2012-10-02T03:49:32.750 に答える
0

PROC FORMAT を使用した SAS ソリューション。ここでは、おそらく必要となるよりも多くの手順を実行します。各手順を分割して、何をしているのかを明確にしています。これにより、各ペアに単一の値が割り当てられ、ペアの両方向に同じ値が割り当てられます。

'ABQ-DEN' または 'DEN-ABQ' を 'ABQ-DEN' に変換する形式を使用して、ラベル自体がグループ定義である R ソリューションとまったく同じことを行うことができます。 label=start は、データの並べ替え前処理ステップで行います。INFORMAT を FORMAT に変換する必要もあります。

proc format;
*What this will look like - this is an example and NOT used in the final solution;
invalue $AIRRT
'ABE-CLT'=1
'CLT-ABE'=1
'ABE-PHL'=2
'PHL-ABE'=2
'ABQ-DEN'=3
'DEN-ABQ'=3
'ABQ-ELP'=4
'ELP-ABQ'=4
'MDW-MCI'=5
;
*Only used to create sample data;
value AIRPORT
1="ABE"
2="CLT"
3="PHL"
4="ABQ"
5="ELP"
6="DEN"
7="MDW"
8="MCI"
;
quit;

*create sample data;
data have;
do _t = 1 to 100;
    origin=put(ceil(8*ranuni(7)),$AIRPORT.);
    do until (destination ne origin);
        destination=put(ceil(8*ranuni(7)),AIRPORT.);
    end;
    output;
end;
run;

*create preliminary dataset for format, creating combined field;
data for_format_pre;
 set have;
 call sortc(of origin destination);
 start = catx('-',origin,destination); 
 keep start origin destination;
run;

*sort down to one per route;
proc sort nodupkey data=for_format_pre;
 by start;
run;

*create final format dataset, with group counter;
data for_format;
set for_format_pre;
 retain fmtname "AIRRT" type 'j';
 label+1;
 output;
 start=catx('-',destination,origin);
 output;
run;

*import into formats;
proc format cntlin=for_format;
quit;

*apply to dataset;
data want;
set have;
combined=catx('-',origin,destination);
group_sort = input(combined,$AIRRT.);
drop _:;
run;
于 2012-09-28T20:43:35.107 に答える