Вы можете попробовать это. Часть Age
- это то, что усложняет код.
d2$Adjustment_factor= apply(d2,1,function(x){
ic = which(d1$Code==x[1]) # select code row
is = grep(x[3],names(d1)) # select sex cols
ia = ifelse(x[2]<16,2,ifelse(x[2]>30,6,4)) # select first age col
icol = intersect(is,ia:(ia+1)) # col is intersection of sex and age (ia:(ia+1) takes both cols)
d1[ic,icol]
})
> d2
Code Age Sex Adjustment_factor
1 X2 16 M 0.4
2 X2 30 F 0.5
3 X1 60 M 0.5
Данные
> dput(d1)
structure(list(Code = c("X1", "X2", "X3"), M_0_15 = c(0.1, 0.3,
0.5), F_0_15 = c(0.2, 0.3, 0.3), M_16_30 = c(0.4, 0.4, 0.3),
F_16_30 = c(0.5, 0.5, 0.4), `M_30+` = c(0.5, 0.5, 0.5), `F_30+` = c(1,
1, 1)), row.names = c(NA, -3L), class = "data.frame")
> dput(d2)
structure(list(Code = c("X2", "X2", "X1"), Age = c(16, 30, 60
), Sex = c("M", "F", "M"), Adjustment_factor = c(0.4, 0.5, 0.5
)), row.names = c(NA, -3L), class = "data.frame")