2017-06-22 11 views
6

IDが以前のグループに存在するかどうかを示す新しい列を作成しようとしています。私のデータは次のとおりです:data.tableの遅れたグループで一致する

data <- data.table(ID = c(1:3, c(9,2,3,4),c(5,1)), 
        groups = c(rep(c("a", "b", "c"), c(3, 4,2)))) 
    ID groups 
1: 1  a 
2: 2  a 
3: 3  a 
4: 9  b 
5: 2  b 
6: 3  b 
7: 4  b 
8: 5  c 
9: 1  c 

遅れたグループを指定する方法がわかりません。私はshiftを使用しようとしましたが、それは働いていない:

data[,.(ID=ID,match_lagged=ID %in% shift(ID)),by=groups] 

は、ここに私の望ましい結果です。

前のグループがないため、最初の3行は一致しません。 FALSEはこれらの3つの行に対しても機能します。 ID = 4(グループb)はグループaと一致しません。 ID = 5(グループc)はグループbと一致しません。

グループcのID 1はグループbと一致しないため、グループaに存在していても偽である必要があります。このため、duplicated(data$ID)は機能しません。グループのデータは、以前のグループと一致する必要があります。

groups ID match_lagged 
1:  a 1   NA 
2:  a 2   NA 
3:  a 3   NA 
4:  b 9   FALSE 
5:  b 2   TRUE 
6:  b 3   TRUE 
7:  b 4   FALSE 
8:  c 5   FALSE 
9:  c 1   FALSE 

dplyr解決策も機能します。

+0

'duplicated(data $ ID)'は機能しません。どうすればよいですか? –

+1

@ d.bいいえ、1つのグループからのデータは、** previous **グループから照合する必要があります。私は質問が重複していない理由をより明確にするために編集しました。 –

答えて

0

これは機能します。そこに簡単ソリューションおそらくです:

data <- data.frame(ID = c(1:3, 1:4,c(5,1)), 
        groups = c(rep(c("a", "b", "c"), c(3, 4,2)))) 

z <- data %>% group_by(groups) %>% summarize(all_vals = list(ID)) 
z <- z %>% mutate(lagged_id = lag(all_vals,1)) 

match_lagged <- lapply(1:nrow(z) , function(x) { 
    (z$all_vals[x] %>% unlist) %in% (z$lagged_id[x] %>% unlist) 
}) 

data$match_lagged = match_lagged %>% unlist 
1

数グループが、その後、diffは、各IDための1に等しいかどうかを確認します。

data[, grp.id := .GRP, by = groups] 
data[, match_lagged := c(FALSE, diff(grp.id) == 1), by = ID][ 
    grp.id == 1, match_lagged := NA][] 
# ID groups grp.id match_lagged 
#1: 1  a  1   NA 
#2: 2  a  1   NA 
#3: 3  a  1   NA 
#4: 9  b  2  FALSE 
#5: 2  b  2   TRUE 
#6: 3  b  2   TRUE 
#7: 4  b  2  FALSE 
#8: 5  c  3  FALSE 
#9: 1  c  3  FALSE 

これは、それぞれのグループでそれぞれIDが1回しか見つからないことを前提としています。

関連する問題