2017-04-11 59 views
1

我有一個數據框,我想將ID的Score值與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 < - data.frame(...)'將無法運行。 –

回答

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 

數據:

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'轉換爲'data.table'(setDT(dt)),按'Group'分組,match'New.ID'以'ID'獲得數字索引並使用它重新排列'Score'並分配(:=)到「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 
相關問題