根据每组的其他列匹配列的值

时间:2017-04-11 16:13:25

标签: r dataframe match

我有一个数据框,我希望将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)

2 个答案:

答案 0 :(得分:2)

我们可以使用data.table。将“data.frame”转换为“data.table”(setDT(dt)),按“组”分组,match将“New.ID”转换为“ID”以获取数字索引并使用该值重新排列“得分”并将其分配(:=)为“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

答案 1 :(得分: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)