我有一个数据框,我想将 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/