Поиск значения на основе других значений - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь повторить то, что (я думаю) является довольно тривиальной вещью в 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) и создать новое значение в новом столбце, основываясь на том, что если age = x и sex = y, то корректирующий код = z, но ярисую бланк с такими функциями, как объединение и сопоставление.

1 Ответ

0 голосов
/ 09 июля 2019

Вы можете попробовать это. Часть 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...