2017-04-11 8 views
1

IDのスコア値をNew.Scoreに一致させたいデータフレームがあります。グループごとの他の列に基づく列の値の一致

ID 123のスコアはグループ1では5ですが、グループ2ではスコア1です。そして、私は各グループ内に表示されるスコアを使用したいだけです。

これは私のDFである:

Group ID Score New.ID New.Score 
    1 123  5 456   
    1 456  1 789   
    1 789  0 123   
    2 555  1 999   
    2 123  1 123   
    2 999  0 555   

そして、私の所望の出力:

Group ID Score New.ID New.Score 
    1 123  5 456   1 
    1 456  1 789   0 
    1 789  0 123   5 
    2 555  1 999   0 
    2 123  1 123   1 
    2 999  0 555   1 

私はaveで試してみました:

mtch <- function(x) { 
    dt[match(x,dt$ID),"Score"] 
} 

dt$New.Score <- ave(dt$New.ID, dt$Group, FUN = mtch) 

しかし、それはNA値を私に与えます。 DF作成のための

コード:

Group <- as.factor(c(1, 1, 1, 2, 2, 2)) 
ID <- as.factor(c(123,456,789, 555, 123, 999)) 
Score <- c(5,1,0, 1,1,0) 
dt <- data.frame(Group, ID, Score, New.ID) 
+1

' New.ID'列はとても 'DT <が不足しています。 –

答えて

1

にあなたは私の前の回答(Set values of column based on other column)と同様のアプローチを使用することができますが、今回はマッチングでinteractionを使用しています。このような何か:

dt$New.Score <- dt[match(interaction(dt$Group,dt$New.ID) , 
         interaction(dt$Group,dt$ID)), "Score"] 

    # Group ID Score New.ID New.Score 
    # 1  1 123  5 456   1 
    # 2  1 456  1 789   0 
    # 3  1 789  0 123   5 
    # 4  2 555  1 999   0 
    # 5  2 123  1 123   1 
    # 6  2 999  0 555   1 

データ: - data.frame(...) `実行されません

Group <- as.factor(c(1, 1, 1, 2, 2, 2)) 
ID <- as.factor(c(123,456,789, 555, 123, 999)) 
Score <- c(5,1,0, 1,1,0) 
New.ID <- as.factor(c(456, 789, 123, 999, 123, 555)) 
dt <- data.frame(Group, ID, Score, New.ID) 
2

我々はdata.tableを使用することができます。 'data.frame'を 'group'でグループ化した 'data.table'(setDT(dt))、 'New.ID'で 'ID'をmatchに変換して数値インデックスを取得し、それを使って 'スコア'を再配置し、 (:=)それはNew.Score "

library(data.table) 
setDT(dt)[, New.Score := Score[match(New.ID, ID)], Group] 
dt 
# Group ID Score New.ID New.Score 
#1:  1 123  5 456   1 
#2:  1 456  1 789   0 
#3:  1 789  0 123   5 
#4:  2 555  1 999   0 
#5:  2 123  1 123   1 
#6:  2 999  0 555   1 
関連する問題