我正在尝试复制(我认为)在excel中要做的一件微不足道的事情,因为我无法完全理解R。 我有一个查找表,其中包含几个调整因子-这些取决于性别和年龄。我将其简化为几个类别
+------+--------+--------+---------+---------+-------+-------+
| Code | M_0_15 | F_0_15 | M_16_30 | F_16_30 | M_30+ | F_30+ |
| X1 | 0.1 | 0.2 | 0.4 | 0.5 | 0.5 | 1 |
| X2 | 0.3 | 0.3 | 0.4 | 0.5 | 0.5 | 1 |
| X3 | 0.5 | 0.3 | 0.3 | 0.4 | 0.5 | 1 |
+------+--------+--------+---------+---------+-------+-------+
所以在我的父数据集中(我想添加到的数据集中),我会得到类似的信息
+------+-----+-----+
| Code | Age | Sex |
| X2 | 16 | M |
| X2 | 30 | F |
| X1 | 60 | M |
+------+-----+-----+
我可以要求excel使用vlookup代码X2,并且根据年龄为16岁且性别为M(我通过级联和额外的查找来实现),列引用为4(从左侧开始计数)。
此vlookup公式在新列中(调整系数)应返回系数0.4,我可以继续使用。粘贴下来会得到:
+------+-----+-----+-------------------+
| Code | Age | Sex | Adjustment_factor |
| X2 | 16 | M | 0.4 |
| X2 | 30 | F | 0.5 |
| X1 | 60 | M | 0.5 |
+------+-----+-----+-------------------+
我知道可以使用合并来“查找”整个范围的值并创建更大的数据集(例如,将邮政编码匹配到另一个地理位置),但是我根本无法理解这种“复合”查找。
我认为我需要做的是遍历每个观察值(excel中的单元格),并根据年龄= x和性别= y然后调整代码= z在新列中创建一个新值,但我正在绘制具有合并和匹配等功能的空白。
答案 0 :(得分:0)
您可以尝试一下。 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")