2016-08-18 8 views
1

他の行に重複している場合、条件に基づいてデータフレームに列を追加します。他の行に重複している場合は、dplyrを使用して列を追加します。

group label value newColumn 
1  1  3 
1  2  4 
1  3  3 
1  4  5 
1  5  4 
2  1  6 
2  2  3 
2  3  9 
2  4  6 
2  5  1 
2  6  3 

私は列を追加したい:

if df$value[i] is duplicated and df$value[i] is the original, set newColumn[i] to 0; 
if df$value[i] is duplicated and df$value[i] is the duplicate, set newColumn[i] to the label of the original; 
if df$value[i] is not duplicated, set df$newColumn[i] to 0. 

例えば:ここ

df$value[1] = 3 is duplicated, but it is the original, so we set newColumn[1] = 0; 
df$value[3] = 3 is duplicated, and it is the duplicate, so we set newColumn[3] = 1 (=df$label[1]); 

が私のコードです:

library(dplyr) 

df <- df %>% 
group_by(group) %>% 
mutate(
newColumn = ifelse(row_number() == min(which(duplicated(value) | duplicated(value, fromLast = TRUE))), 
          label[max(which(duplicated(value) | duplicated(value, fromLast = TRUE)))], 
          0) 
) 

しかし、このような私のデータフレーム助けにならない。なにか提案を?前もって感謝します!ここで

+0

を使用することができます「オリジナル」あなたはそれが最初の行ごとの発生を意味しますか? –

+0

私は "オリジナル"だと思うのですが、初めてdfに現れるのです – Llopis

+0

はい、最初に現れる番号です。 –

答えて

2

ave()を使用してソリューションです:

df$newColumn <- ave(df$label,df$value,FUN=function(x) c(0L,rep(x[1L],length(x)-1L))) 
df; 
## group label value newColumn 
## 1  1  1  3   0 
## 2  1  2  4   0 
## 3  1  3  3   1 
## 4  1  4  5   0 
## 5  1  5  4   2 
## 6  2  1  6   0 
## 7  2  2  3   1 
## 8  2  3  9   0 
## 9  2  4  6   1 
## 10  2  5  1   0 
## 11  2  6  3   1 

ave()は、第二引数に応じてグループに最初の引数を分割し、各グループごとに一度ラムダを呼び出します。たとえば、df$valueが3に等しいすべての行について、ave()は、これらの行からすべての値df$labelからなるベクトルを構成し、そのベクトルと等しいλをラムダと呼びます。ラムダ呼び出しの戻り値は、引数xと同じ数の要素を含むことが期待されます(または、そうするために必要に応じてリサイクルされます)。

ラムダのすべての呼び出しの戻り値は、1つの最終ベクトルに結合され、各戻り値の各要素は入力からの対応する位置に対応する位置に配置されます。これにより、グループごとに最終列ベクトルを構築することができます。あなたの問題は、各グループの最初の要素のゼロと、各グループのすべての後続要素の元のラベル値を返さなければならないので、そのサブベクトルをラムダで簡単に構築することができます。グループベクトル。

+0

ニース機能、それを少し説明していただけますか?私がそれを見るのは初めてです:( – Llopis

+0

ありがとう、すばらしい解決策。 –

2

またによってdata.table

library(data.table) 
setDT(df)[, newColumn := c(0, rep(label[1L], .N-1)) , value] 
関連する問題