根据其他值查询一个值

时间:2019-07-09 14:36:28

标签: r

我正在尝试复制(我认为)在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在新列中创建一个新值,但我正在绘制具有合并和匹配等功能的空白。

1 个答案:

答案 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")