2017-10-30 6 views
2

Identify duplicates of one value with different values in another column;私は解決策が近いと感じましたが、dplyr mutate関数は、max(ID)を以下のコードで使用し、変更後の値(再帰的に)ではなく、事前に突然変異した状態のmaxを参照するため機能できませんでした。dplyrで現在変異している変数の最大値を調べる

目的は、現在のアドレスが同じID値の前のアドレスと一致しない行に新しい一意のID値を割り当てることです。

私が試しコード:

# A tibble: 13 x 2 
     ID Address 
    <dbl> <chr> 
1  1  X 
2  1  X 
3  6  Y 
4  2  Z 
5  2  Z 
6  3  A 
7  6  B 
8  4  C 
9  6  D 
10  6  E 
11  5  F 
12  5  F 
13  5  F 

予想される出力:

ID Address 
1  X 
1  X 
6  Y 
2  Z 
2  Z 
3  A 
7  B 
4  C 
8  D 
9  E 
5  F 
5  F 
5  F 

任意の助けをいただければ幸いです

df <- read.table(text = 'ID  Address 
1  X 
       1  X 
       1  Y 
       2  Z 
       2  Z 
       3  A 
       3  B 
       4  C 
       4  D 
       4  E 
       5  F 
       5  F 
       5  F 
       ', header= T, stringsAsFactors = F) 


df %>% group_by(ID) %>% mutate(flag = ifelse(lag(Address)==Address,F,T)) %>% 
    mutate(flag = ifelse(is.na(flag),F,flag)) %>% ungroup() %>% 
    mutate(newID = ifelse(flag | is.na(flag), max(ID)+1,ID))%>% 
    select(ID = newID,Address) 

は出力を受け取りました!

編集:

理想コード:私が使用する現在の変異可変であるnewIDを使用することができましたはずです。

> df %>% group_by(ID) %>% mutate(flag = ifelse(lag(Address)==Address,F,T)) %>% 
+  mutate(flag = ifelse(is.na(flag),F,flag)) %>% ungroup() %>% 
+  mutate(newID = ifelse(flag | is.na(flag), max(newID)+1,ID))%>% 
+  select(ID = newID,Address) 
+0

に置き換えることができmax(ID) + seq_len(sum(flag))max(ID) + 1を交換し、代わりにifelseあなたの問題を理解して、あなたの予想される出力は@akrunと私がリンク先であなたに与えたものです –

+0

私はそれが理想的であったはずの方法でコードを更新しました。助けてくれますか? – amrrs

+0

あなたの投稿を理解することはできませんが、@akrunは明らかに私を必要としない可能性があります;)。 –

答えて

2

一つの問題は、一定の値と第二の問題を与えるmax(ID) + 1が「はい」と「いいえ」の等しい長さのベクトルを必要とするifelse自体です。以下の解決策では、我々はまたreplace

df %>% 
    group_by(ID) %>% 
    mutate(flag = lag(Address, default = Address[1])!= Address) %>% 
    ungroup() %>% 
    mutate(newID = replace(ID, flag, max(ID) + seq_len(sum(flag))))%>% 
    select(ID = newID,Address) 
# A tibble: 13 x 2 
#  ID Address 
# <dbl> <chr> 
# 1  1  X 
# 2  1  X 
# 3  6  Y 
# 4  2  Z 
# 5  2  Z 
# 6  3  A 
# 7  7  B 
# 8  4  C 
# 9  8  D 
#10  9  E 
#11  5  F 
#12  5  F 
#13  5  F 

を使用し、「フラグ」を作成するには、2つのifelse文は「私はドン単一の文

+1

それは素晴らしいです!この部分は '' '' seq_len(sum(flag)) ''で、増分値を作成するのに 'TRUE'を使用していますか? – amrrs

+1

@amrrs 'sum(flag)'は4で、 'seq_len(4)#[1] 1 2 3 4'だから、必要なインクリメントを与えるでしょう – akrun

+1

この知識がなければ、文字通り何時間も頭を叩きました。ありがとうございました! – amrrs

関連する問題