2016-06-20 16 views
0

私は、次のデータセットがあります。Rのgreplの後にデータセットをフィルタリングする?

USERNAME API_TRACK_EVENT   TIME 
userA Viewed pic    1454941960 
userA Order/payment   1454941972 
userA Order/Changed Address 1454941976 
userB Viewed pic    1454941983 
userB Order/guestlogin  1454941986 
userB Order/Changed Address 1454941992 

は私がユーザーBのためにのみ、以前のユーザAのための「注文/支払」を意味する「注文」、および「注文/ guestlogin」を取りたいです。

他のすべての非順序イベントは同じままである必要があります。

ので、出力データセットは次のようになります。だから、

USERNAME API_TRACK_EVENT   TIME 
userA Viewed pic    1454941960 
userA Order/payment   1454941972 
userB Viewed pic    1454941983 
userB Order/guestlogin  1454941986 

、私はこれをどのようにしたらよいでしょうか? [dplyrも公開しています]

答えて

3

で@docendodiscimus


それとも最初の方法論を使用してからの拠出金で編集は基本Rとオプションですユーザー名と時刻によるデータ:

df <- df[order(df$USERNAME, df$TIME),] 

a)の行は注文情報が含まれているかどうかチェックする:USERNAMEのグループによって

idx <- grepl("Order", df$API_TRACK_EVENT, ignore.case = TRUE) 

B)サブセット

subset(df, ave(idx, USERNAME, FUN = cumsum) <= 1L | !idx) 

# USERNAME API_TRACK_EVENT  TIME 
#1 userA  Viewed_pic 1454941960 
#2 userA Order/payment 1454941972 
#4 userB  Viewed_pic 1454941983 
#5 userB Order/guestlogin 1454941986 

このサブセットのみ一次行と他の行(注文情報なし)。

+0

申し訳ありませんが、私は行が注文accである必要があるという詳細を見逃しました。その結果のデータセットには最も早いものが存在するはずです。他の答えに対するあなたのコメントのおかげで、私は間違いについて思い出しました:) – Dawny33

+0

@ Dawny33、私はデータを注文するステップを追加しました –

+0

このような詳細な答えをありがとう。 :) – Dawny33

2

slice/which.max/grepを使用してdplyrの行を除外することができます。 'USERNAME'でグループ化した後、greplの論理インデックスを取得し、which.maxとラップして、最初のTRUE値の数値インデックスを取得します。1:indexsliceから列をサブセット化するにはseqを使用します。このアプローチでは、この例で示されているように、各「ユーザー名」の最後に「注文」要素が存在することを前提としています。 「順序」の要素が順序付けされていない場合

library(dplyr) 
df1 %>% 
    arrange(USERNAME, TIME) %>% 
    group_by(USERNAME) %>% 
    slice(seq(which.max(grepl("Order", API_TRACK_EVENT)))) 
# USERNAME API_TRACK_EVENT  TIME 
#  <chr>   <chr>  <int> 
#1 userA  Viewed pic 1454941960 
#2 userA Order/payment 1454941972 
#3 userB  Viewed pic 1454941983 
#4 userB Order/guestlogin 1454941986 

しかし、私たちは「注文」または唯一の最初の「注文」の要素を持っていない任意の要素を持つ行を保つためにgreplduplicatedを使用することができます。

df1 %>% 
    arrange(USERNAME, TIME) %>% 
    group_by(USERNAME) %>% 
    filter({idx = grepl("^Order", API_TRACK_EVENT); 
      !duplicated(idx)|!idx}) 

# USERNAME API_TRACK_EVENT  TIME 
#  <chr>   <chr>  <int> 
#1 userA  Viewed pic 1454941960 
#2 userA Order/payment 1454941972 
#3 userB  Viewed pic 1454941983 
#4 userB Order/guestlogin 1454941986 

注:

0)順序:ここdata.table

library(data.table) 
setDT(df1)[df1[order(USERNAME, TIME), .I[seq(which.max(grepl("Order", 
         API_TRACK_EVENT)))], USERNAME]$V1] 
+0

最終行の説明は可能ですか? 'slice(seq(which)grep(" Order "、API_TRACK_EVENT))))< - This – Dawny33

+0

@akrun(+1)答えをありがとう。時間に応じて注文する必要があり、「最も早い」ものを取りたい場合、どのような変更を行うことができますか? qnの詳細を見逃して申し訳ありません:) – Dawny33

+0

@docendodiscimusコメントをいただきありがとうございます。私は '{}'について忘れました – akrun

関連する問題