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

标签 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)

最佳答案

我们可以使用data.table。将“data.frame”转换为“data.table”(setDT(dt)),按“Group”分组,将“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

关于r - 根据每组的其他列匹配列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43351200/

相关文章:

python - 合并3个同名数据库,并在python中重命名它们

python - 比较 Pandas 中的当前行和上一行

arrays - 查找索引(匹配)数组中的最小值[EXCEL]

javascript - 替换大括号 JavaScript 中的文本

MySQL MATCH AGAINST 功能

r - 获取 R 中每行的最后一个非零列名称并创建一个单独的列

r - 如何根据 df1 中的开始日期和结束日期使用 df2 中变量的总和在 df1 中创建新变量?

Java/R 接口(interface) (JRI)

r - as.Date 在 R : 'character string is not in a standard unambiguous' 中失败

python (Pandas) 根据不同列满足的条件从第 0 列输出值