#r #function #if-statement #conditional-statements
Вопрос:
Мне нужно написать функцию для разделения столбца на элемент матрицы, если выполняются два условия. Эти два условия изменяются также в элементе матрицы.
foo lt;- c('A', 'B', 'C', 'D', 'F', 'G') phi lt;- c('Z1', 'Z1', 'X3', 'W4', 'V5', 'W4') tal lt;- c('1-2', '3-4', '5-6', '7-8', '9-10', '11-12') n lt;- c(324, 872, 163, 953, 453, 943) df lt;- data.frame(foo, phi, tal, n) mtx lt;- c(5983, 4079, 4253, 3516, 3452, 2519, 10079, 3083, 1998, 3115, 3545, 327790, 6847, 2583, 2193, 2221, 3557, 5031, 866, 3685, 3452, 2519, 10079, 3083, 1998) mtx lt;- matrix(mtx, 6, 6, dimnames = list(c('Z1', 'Y2', 'X3', 'W4', 'V5', 'U6'), c('1-2', '3-4', '5-6', '7-8', '9-10', '11-12')))
Мне нужно написать что-то вроде этого:
df$P lt;- ifelse(df$phi=="Z1" amp; df$tal == "1-2", df$n/mtx[1,1], df$phi=="Z1" amp; df$tal == "3-4", df$n/mtx[1,2], df$phi=="Y2" amp; df$tal == "1-2", df$n/mtx[2,1])
Я знаю ifelse
, что самой функции недостаточно, чтобы получить то, что мне нужно. Сможет ли кто-нибудь найти решение? Большое спасибо
Комментарии:
1. Вы можете взглянуть на эту
ifelse
функцию.2. Я думаю, вам нужны некоторые вложенные
ifelse
операторы илиdplyr
case_when
функция s.
Ответ №1:
Использование within
одних и тех же подмножеств в LHS и RHS.
df lt;- within(df, { P lt;- NA P[phi == "Z1" amp; tal == "1-2"] lt;- n[phi == "Z1" amp; tal == "1-2"]/mtx[1, 1] P[phi == "Z1" amp; tal == "3-4"] lt;- n[phi == "Z1" amp; tal == "3-4"]/mtx[1, 2] P[phi == "Y2" amp; tal == "1-2"] lt;- n[phi == "Y2" amp; tal == "1-2"]/mtx[2, 1] }) df # foo phi tal n P # 1 A Z1 1-2 324 0.05415343 # 2 B Z1 3-4 872 0.14574628 # 3 C X3 5-6 163 NA # 4 D W4 7-8 953 NA # 5 F V5 9-10 453 NA # 6 G W4 11-12 943 NA