2017-01-19 30 views
-1

私は膨大なデータフレームを持ち、何百万もの電子メールアドレスとそのオープンタイムを持っています。以下は私のデータフレームのサブセットです。大きなデータで最大数の時間間隔を見つける

enter image description here

dput(droplevels(data)) 
structure(list(email_address_hash = structure(1:3, .Label = c("0004eca7b8bed22aaf4b320ad602505fe9fa9d26", 
"00198ee5364d73796e0e352f1d2576f8e8fa99db", "35c0ef2c2a804b44564fd4278a01ed25afd887f8" 
), class = "factor"), open_times = c(" 04:39:24 10:39:43", " 21:12:04 07:05:23 06:31:24", 
" 09:57:20 19:00:09")), row.names = c(NA, -3L), .Names = c("email_address_hash", 
"open_times"), .internal.selfref = <pointer: 0x0000000007b60788>, class = c("data.table", 
"data.frame")) 

私のデータフレームの構造が、私はこれらの2つのゴール

目的を達成したい

str(data) 
Classes ‘data.table’ and 'data.frame': 3 obs. of 2 variables: 
$ email_address_hash: Factor w/ 36231 levels "00012aec4ca3fa6f2f96cf97fc2a3440eacad30e",..: 2 16 7632 
$ open_times  : chr " 04:39:24 10:39:43" " 21:12:04 07:05:23 06:31:24" " 09:57:20 19:00:09" 
- attr(*, ".internal.selfref")=<externalptr> 

です: -

1)を開始します00:00:00時間から1時間の間隔をとり、私が得た顧客あたりのエントリの数を数えます。私たちの最初のケースでは、最初の行のopen_timesは04:39:24と10:39:43です。したがって、b/w 4:00:00- 5:00:00とb/w 10:00:00と11:00:00の1つのカウントを取得し、b/w 00: 00:00と01:00:00などです。エントリの最大数を持つ最初の2つのカウントだけが必要です。この場合、それは4:00:00-5:00:00と10:00:00-11:00:00であり、他の列のそれぞれの数です。

2)時間を変更することは可能ですか同じ場合に1時間から1.5時間または2時間の間隔?以下のより詳細な説明を提供するために

は私の所望の出力 enter image description here の画像は、私がビッグデータを持っていて、この問題を解決するためのいくつかの効率的な方法を提案してくださいです。私の質問に投票するのではなく、あなたに不明な点がある場合は、教えてください。

+0

@akrun – user110244

答えて

0

は、データを要約するために使用できる長い形式にデータを再構成します。この例では、dplyrパッケージを使用しています。

より洗練された時間と日付を扱う方法を学びます。私は文字列から時間のさまざまな要素を分離しています。

# A tibble: 7 × 2 
hr  n 
<chr> <int> 
04  1 
06  1 
07  1 
09  1 
10  1 
19  1 
21  1 

require(dplyr) 
require(tidyr) 

norm <- df %>% mutate(times=trimws(open_times)) %>% 
    separate(times,c('t1','t2','t3','t4'), sep = " ") %>% 
    gather(key, value, -email_address_hash,-open_times) %>% 
    filter(!is.na(value)) %>% 
    separate(value, into = c('hr','min','sec'), sep=":") 


norm %>% 
    group_by(hr) %>% summarise(n = n()) 

結果あなたはそうのような異なる間隔を使用してグループを計算することができます。

interval <- 90 

norm %>% 
    mutate(minutes = 60*as.numeric(hr)+as.numeric(min), 
    group = (minutes-minutes%%interval)/interval) %>% 
    group_by(group) %>% summarise(n = n()) 

は私が午前0時からの分を計算し、90分のグループを作るためにその値を使用(1.5時間)。

これは、正規化されたデータの構造です:

:その結果

norm %>% 
    mutate(minutes = 60*as.numeric(hr)+as.numeric(min), 
    group = floor(minutes/120)) %>% 
    mutate(label = paste0(group*2,":00-",group*2+2,":00")) %>% 
    group_by(email_address_hash, label) %>% summarise(n = n()) %>% 
    spread(label, n) 

:あなたはこれを使用することができますが、一例で追加した結果を生成するには

> str(norm) 
'data.frame': 7 obs. of 6 variables: 
    $ email_address_hash: Factor w/ 3 levels "0004eca7b8bed22aaf4b320ad602505fe9fa9d26",..: 1 2 3 1 2 3 2 
$ open_times  : chr " 04:39:24 10:39:43" " 21:12:04 07:05:23 06:31:24" " 09:57:20 19:00:09" " 04:39:24 10:39:43" ... 
$ key    : chr "t1" "t1" "t1" "t2" ... 
$ hr    : chr "04" "21" "09" "10" ... 
$ min    : chr "39" "12" "57" "39" ... 
$ sec    : chr "24" "04" "20" "43" ... 

email_address_hash `10:00-12:00` `18:00-20:00` `20:00-22:00` `4:00-6:00` `6:00-8:00` `8:00-10:00` 
<fctr>    <int>   <int>   <int>   <int>  <int>  <int> 
0004eca7...  1    NA   NA    1   NA   NA 
00198ee5...  NA   NA   1    NA   2   NA 
35c0ef2c...  NA   1    NA   NA   NA   1 

Allthoughtあなたの出力の例とまったく同じではありません。それは、私があなたが探しているデータ構造に同意しないからです。

+0

あなたはhh:mm:ssに時刻を区切ってくれます。私は別のものが欲しかった。私が間違っていると私を訂正してください – user110244

+0

このスクリプトを試して、ノルム構造を見れば、あなたが望むものに簡単に適応できます。それ以外の場合は、結果の 'data.frame'の例を追加してください。 – Wietze314

+0

お返事ありがとうございます。私はあなたの要件に応じて質問を編集しました。これがあなたにとって理にかなっているかどうか教えてください – user110244

関連する問題