这是一个干净且通用的解决方案,使用merge
.
dat1 <- data.frame(Lab=c(1,2,3,4),
coef = c(1/5,1/8,1/7,1/9))
dt.m <- merge(dat,dat1,all.x=TRUE)
dt.m$coef[is.na(dt.m $coef)] <- 1 ## default value
dtt <- transform(dt.m,newScore=Score*coef)
Lab User Score coef newScore
1 1 A 5 0.2000000 1.0000000
2 1 B 3 0.2000000 0.6000000
3 2 A 6 0.1250000 0.7500000
4 2 C 5 0.1250000 0.6250000
5 3 B 4 0.1428571 0.5714286
6 4 A 7 0.1111111 0.7777778
编辑如果你想获得与原始数据相同的顺序,结构:
dtt[order(dtt$User),c('User','Lab','Score','newScore')]
User Lab Score newScore
1 A 1 5 1.0000000
3 A 2 6 0.7500000
6 A 4 7 0.7777778
2 B 1 3 0.6000000
5 B 3 4 0.5714286
4 C 2 5 0.6250000