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