2016-10-25 7 views
-3

ID、日付、および関連するIDと開始日の組み合わせのデータがありますが、IDごとに複数の日付があります。データテーブルに重複が見つかりました

私が示す列を作成したいと思います:IDは整数、または12ヶ月の期間中に4つの別々の整数のカウントから合計> = 14を持っているなら、私に言って

1)。

あり、ここで同様の問題があるが、鉱山のカテゴリはもう少し複雑です: Create new column based on condition that exists within a rolling date

すべてのヘルプは大歓迎!ここで

は、いくつかのデータのdputです:

structure(list(ID = c("90939293", "90963328", "90092983", 
"90032926", "90944838", "90092983", "90062392", "90224939", "90202398", 
"90926203", "90936043", "90329263", "90944838", "90232033", "90980903", 
"90924463", "90299292", "90933383", "90209349", "90092983", "90022988", 
"90022293", "90933383", "90092983", "90299240", "90963033", "90004923", 
"90292998", "90986096", "90980903", "90336692", "90933383", "90022988", 
"90069992", "90062392", "90209248", "90924463", "90092983", "90933383", 
"90022293", "90062392", "90004923", "90233269", "90329263", "90229202", 
"90309943", "90299292", "90036820", "90329263", "90232033", "90329263", 
"90336692", "90963033", "90224939", "90924463", "90069992", "90092983", 
"90934923", "90926203", "90222333", "90092983", "90299292", "90202398", 
"90004923", "90233269", "90926203", "90222333", "90224939", "90232033", 
"90933383", "90022293", "90022988", "90934923", "90069992", "90329263", 
"90209349", "90022293", "90309943", "90299240", "90022293", "90336692", 
"90020334", "90933383", "90290384", "90224939", "90980903", "90299240", 
"90299292", "90202398", "90022346"), Date = structure(c(15972, 
16009, 16010, 16010, 16007, 16010, 16006, 16010, 16007, 16008, 
15997, 16007, 16007, 16002, 16008, 16006, 16006, 16006, 16009, 
16010, 16006, 16006, 16006, 16010, 15995, 16008, 16008, 16010, 
16009, 16008, 16010, 16006, 16006, 16009, 16006, 16006, 16006, 
16010, 16006, 16006, 16006, 16008, 16009, 16007, 16010, 16007, 
16006, 16009, 16007, 16002, 16007, 16010, 16008, 16010, 16006, 
16009, 16010, 15936, 16008, 16008, 16010, 16006, 16007, 16008, 
16009, 16008, 16008, 16010, 16002, 16006, 16006, 16006, 15936, 
16009, 16007, 16009, 16006, 16007, 15995, 16006, 16010, 16006, 
16006, 16010, 16010, 16008, 15995, 16006, 16007, 16008), class = "Date"), 
    Integer = c(39, 2, 1, 1, 4, 1, 5, 1, 4, 3, 14, 4, 4, 9, 
    3, 5, 5, 5, 2, 1, 5, 5, 5, 1, 16, 3, 3, 1, 2, 3, 1, 5, 5, 
    2, 5, 5, 5, 1, 5, 5, 5, 3, 2, 4, 1, 4, 5, 2, 4, 9, 4, 1, 
    3, 1, 5, 2, 1, 75, 3, 3, 1, 5, 4, 3, 2, 3, 3, 1, 9, 5, 5, 
    5, 75, 2, 4, 2, 5, 4, 16, 5, 1, 5, 5, 1, 1, 3, 16, 5, 4, 
    3)), .Names = c("ID", "Date", "Integer" 
), row.names = c("200086", "200066", "200050", "200064", "200078", 
"200050.1", "200069", "200082", "200083", "200053", "200056", 
"200055", "200078.1", "200079", "200051", "200089", "200052", 
"200057", "200061", "200050.2", "200060", "200080", "200057.1", 
"200050.3", "200068", "200071", "200070", "200059", "200062", 
"200051.1", "200067", "200057.2", "200060.1", "200072", "200069.1", 
"200073", "200089.1", "200050.4", "200057.3", "200080.1", "200069.2", 
"200070.1", "200081", "200054", "200063", "200075", "200052.1", 
"200074", "200054.1", "200079.1", "200055.1", "200067.1", "200071.1", 
"200082.1", "200089.2", "200072.1", "200050.5", "200084", "200053.1", 
"200088", "200050.6", "200052.2", "200083.1", "200070.2", "200081.1", 
"200053.2", "200088.1", "200082.2", "200079.2", "200057.4", "200080.2", 
"200060.2", "200084.1", "200072.2", "200055.2", "200061.1", "200080.3", 
"200075.1", "200068.1", "200080.4", "200067.2", "200065", "200057.5", 
"200090", "200082.3", "200051.2", "200068.2", "200052.3", "200083.2", 
"200076"), class = "data.frame") 
+5

"IDごとに複数の日付がある" - '任意の(重複(DFます$ X1))'あなたのサンプルデータのためにあなたに同意しません。あなたのID(最初の列は、あなたの例では 'X1'と呼ばれています)は一意です。または、いくつかの日付に複数のIDを意味しましたか?いずれにしても、100行ではなく、小さな**例を作成してください。 – Spacedman

+0

これは明確ではありません。「12桁の期間内にIDが14個の整数または4個の整数の合計を持つ場合、私に知らせる」。 「14個の整数の合計」とはどういう意味ですか? 1 + 2 + 3 + 4 + 1 + 2 + 3 + 4 + 1 + 2 + 3 + 4 + 7 + 99は14個の整数の和です。あなたはそれを意味するものではありませんか? – Spacedman

+0

私はおそらくここであまりにも多くの質問をしていると思うので、部分的な答えを失望させるので、一人の人があなたのすべての問題を解決しなければ、答えは得られません。この投稿を削除していくつか作成することをお勧めします - 最初に、どのInteger列の値の合計が14に等しいかを見つける方法があります。 – Spacedman

答えて

1

'X' のように:

library(data.table) 

setDT(x, key = "Date") 

# test 1 
x[, `:=` (
    test1 = sum(Integer) >= 14 
), by = ID] 

# test2 
y = x[, .(
    count12 = uniqueN(Integer) 
), by = .(start = Date, end = Date - 365)] 

# combine 
z = merge(x, y, by.x = "Date", by.y = "start") 
z[, end := NULL] 
z[, flag := test1 | count12 == 4] 
1

は、ここであなたが求めているもので刺すのです。今度は、Integerの合計が14より大きいIDを見つけることは、IDでグループ化し、各IDのInteger列の合計が> = 14か、またはdplyr:df %>% group_by(ID) %>% mutate(conditional = sum(Integer) >= 14)であるかどうかをチェックするのと同じくらい簡単です。 12か月間に(少なくとも?)4のIDを見つけることは明らかに困難です。私の解決策は、ウィンドウの数を調べるにあたってthisの答えに従っています。

ただ1つの注意点があります:roll_sumは行数を超えて動作するため、私が使用する解決策は1つのIDが1日あたり1行しかないことに依存しています。あなたのサンプルデータフレームには、実際に同じID日付の複数のエントリがありますが、それらは重複しているようですので、削除しました。一致しない場合は、sum(Integer) >= 14の条件で重複値を計算する必要があります。削除する代わりに、あらかじめ合計することができます(例:df %>% group_by(ID, Date) %>% summarize(Integer = sum(Integer)))。

library(dplyr) 
library(tidyr) 
library(RcppRoll) 

df_tmp <- df 
df <- df_tmp %>% 
    group_by(ID, Date) %>% 
    filter(n() == 1) %>% # this line removes duplicate columns 
    ungroup() %>% 
    complete(ID, 
      Date=seq(from=min(Date)-365,to=max(Date), by=1), 
      fill=list(Integer=0)) %>% # we use complete to add in a row for all IDs for every single date since a year before the first obs. 
    arrange(ID, Date) %>% 
    group_by(ID) %>% 
    mutate(roll_count = roll_sum(x = Integer != 0, n = 365, fill=0, align="right"), # this calculates the rolling sum using n = 365 as a stand-in for 12 months 
     conditional = sum(Integer) >= 14 || roll_count >= 4) %>% 
    ungroup() %>% 
    right_join(df, by = c("ID","Date", "Integer")) # right_join with the original data to remove dummy dates 

あなたのdputと

関連する問題