2016-02-02 41 views
1

具有代表性的樣本,我有以下數據集:創建從一個大的CSV

head -2 trip_data_1.csv 

medallion,hack_license,vendor_id,rate_code,store_and_fwd_flag,pickup_datetime,dropoff_datetime,passenger_count,trip_time_in_secs,trip_distance,pickup_longitude,pickup_latitude,dropoff_longitude,dropoff_latitude 
89D227B655E5C82AECF13C3F540D4CF4,BA96DE419E711691B9445D6A6307C170,CMT,1,N,2013-01-01 15:11:48,2013-01-01 15:18:10,4,382,1.00,-73.978165,40.757977,-73.989838,40.751171 

的按日期記錄的簡單計數給我下面的輸出:

Count Date 
557203 2013-01-26 
543734 2013-01-18 
537188 2013-01-25 
533039 2013-01-24 
531161 2013-01-31 
521398 2013-01-11 
520520 2013-01-23 
512533 2013-01-17 
510530 2013-01-19 
507429 2013-01-12 
500065 2013-01-16 
496899 2013-01-15 
496005 2013-01-22 
487949 2013-01-10 
482378 2013-01-30 
478437 2013-01-04 
477380 2013-01-29 
473804 2013-01-05 
470833 2013-01-27 
459393 2013-01-20 
457471 2013-01-09 
450789 2013-01-28 
443650 2013-01-14 
442541 2013-01-13 
441778 2013-01-08 
441233 2013-01-03 
412630 2013-01-01 
407363 2013-01-07 
403667 2013-01-06 
393001 2013-01-02 
384614 2013-01-21 

我的問題是:如何做我創建了一個子集(最好佔總行數的10%),以便它代表整個數據集?我需要確保每個日期至少有40,000行數據。

Link to the dataset

+1

我有一個很好的解決方案在這裏... http://stackoverflow.com/a/22303906/2836621 –

+0

發佈它作爲答案? –

回答

2

可以使用awk這樣的:

awk 'rand()>0.9' trip_data_1.csv 

它只是生成0和1之間的隨機數,因爲它讀取每個記錄,如果該隨機數爲> 0.9,將打印的記錄 - 因此應平均打印10%的記錄。

如果您想報頭爲好,使用方法:

awk 'FNR==1 || rand()>0.9' trip_data_1.cv 

如果你想它真正隨機的,而不是可預測的隨機:-)

awk 'BEGIN{srand()} FNR==1 || rand()>0.9' trip_data_1.cv 
1

獲取隨機樣本:

sort -R filename | head -n $(($(wc -l filename | awk '{print $1}')/10)) 
# random sort | get  10% (length divided by 10) 

你必須先刪除CSV頭,然後安裝回去。將其作爲練習:)

出於效率原因,您可能希望將其與本機應用程序一起實現。