R 基于其他值查找值

R 基于其他值查找值,r,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

我试图复制(我认为)在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,在新列中创建一个新值,但我正在绘制一个空白,其中包含诸如合并和匹配等函数

你可以试试这个。
年龄的一部分是使代码复杂化的原因

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  

你可以试试这个。
年龄的一部分是使代码复杂化的原因

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  

非常感谢您的快速回复。我将不得不研究这个例子——对于excel中的一个简单函数来说,它似乎非常复杂。唯一让它复杂的是
年龄
,因为它从前两个案例到最后一个案例(60+)在格式上有所不同。非常感谢您的快速回复。我将不得不研究这个例子——对于excel中的一个简单函数来说,它似乎非常复杂。唯一让它复杂的是
年龄
,因为从前两个案例到最后一个案例(60+)的格式不同