Я создаю страховой рейтер в R. Я хочу создать одну (иногда сложную) функцию с несколькими аргументами, а затем повторить эту функцию для каждого страхователя (строки данных). Мне нужно будет создать около 200 таких функций для этого проекта. Функция работает нормально, и она просто просматривает значения в таблице ставок и складывает или умножает, когда, что и как мне нужно. Мой вопрос заключается в том, как я могу отобразить или зациклить или иным образом повторить эту функцию, когда у меня есть 2 или более аргументов, передаваемых в функцию непосредственно из фрейма данных?
Я думал, что моя кодировка работает, но потом я понял, что карта (или map_dbl) извлекает только первый элемент второго аргумента в моей функции.
library(dplyr)
library(readr)
library(purrr)
#dummy data frames that represent a rating table, and a policy
#holder dataset
data_frame_Rate_Table<-data.frame("Policy_Class"=c("red", "white","blue"),"Rate"=c(3,9,19),"Factor_1"= 1:3,"Factor_2"=7:9)
data_frame_Policyholders<-data.frame("Policy_number"=1:10,"Policy_Class"=rep(c("red","red","white","blue","blue"),2),"Risk"=c(rep("High",5),rep("Low",5)),"Lapse"=rep(c("Y","N"),5))
function_example<-function(x,y,z){
Policy_Class<-x
Risk<-y
Lapse<-z
Rate<-ifelse(Policy_Class= = "red",
data_frame_Rate_Table[data_frame_Rate_Table['Policy_Class']==Policy_Class,"Rate"]*data_frame_Rate_Table[data_frame_Rate_Table['Policy_Class']==Policy_Class,"Factor_1"]+
(ifelse(Risk= = "High",3,1))*data_frame_Rate_Table[data_frame_Rate_Table['Policy_Class']==Policy_Class,"Factor_2"]+ifelse(Lapse= = "Y",10,0),
ifelse(Policy_Class= = "white",
data_frame_Rate_Table[data_frame_Rate_Table['Policy_Class']==Policy_Class,"Rate"]*data_frame_Rate_Table[data_frame_Rate_Table['Policy_Class']==Policy_Class,"Factor_1"]+
(ifelse(Risk= = "High",5,1))*data_frame_Rate_Table[data_frame_Rate_Table['Policy_Class']==Policy_Class,"Factor_2"]+ifelse(Lapse= = "Y",15,0),
ifelse(Policy_Class= = "blue",
data_frame_Rate_Table[data_frame_Rate_Table['Policy_Class']==Policy_Class,"Rate"]*data_frame_Rate_Table[data_frame_Rate_Table['Policy_Class']==Policy_Class,"Factor_1"]+
(ifelse(Risk= = "High",10,1))*data_frame_Rate_Table[data_frame_Rate_Table['Policy_Class']==Policy_Class,"Factor_2"]+ifelse(Lapse= = "Y",33,0))))
Rate
}
Я старался:
result<-map_dbl(data_frame_Policyholders$Class,function_example, data_frame_Policyholders$Risk,data_frame_Policyholders$Lapse)
Но это не то, что мне нужно.
Ожидаемые результаты:
#copy and paste this coding into R to get the actual
#values that should go into the vector
function_example("red","High","Y")
function_example("red","High","N")
function_example("red","Low","Y")
function_example("red","Low","N")
function_example("white","High","Y")
function_example("white","High","N")
function_example("white","Low","Y")
function_example("white","Low","N")
function_example("blue","High","Y")
function_example("blue","High","N")
function_example("blue","Low","Y")
function_example("blue","Low","N")
Но я, очевидно, не могу напечатать каждую комбинацию
Мне нужна функция, которая перебирает каждого держателя полиса и выдает результат в числовом векторе, который выстраивается в линию. Может ли purrr сделать это? Есть ли лучший способ пойти сюда?
Аналогично в базе R: with(data_frame_Policyholders, Map(function_example, Class, Risk, Lapse))
На самом деле, Map вернет список, вместо этого вы можете использовать mapply: with(data_frame_Policyholders, mapply(function_example, Policy_Class, Risk, Lapse))





Ну, во-первых, нужно читать данные как символы, а не как факторы. Во-вторых, поскольку у вас есть несколько входных данных для вашей функции, вам понадобится pmap, а не только map.
library(dplyr)
library(purrr)
data_frame_Policyholders %>%
mutate(new = pmap_dbl(list(Policy_Class, Risk, Lapse), function_example))
# Policy_number Policy_Class Risk Lapse new
#1 1 red High Y 34
#2 2 red High N 24
#3 3 white High Y 73
#4 4 blue High N 147
#5 5 blue High Y 180
#6 6 red Low N 10
#7 7 red Low Y 20
#8 8 white Low N 26
#9 9 blue Low Y 99
#10 10 blue Low N 66
данные
data_frame_Rate_Table<- data.frame(Policy_Class = c("red", "white","blue"),
Rate=c(3,9,19),"Factor_1"= 1:3,Factor_2=7:9, stringsAsFactors = FALSE)
data_frame_Policyholders <- data.frame(Policy_number . = 1:10,
Policy_Class=rep(c("red","red","white","blue","blue"),2),
Risk=c(rep("High",5),rep("Low",5)),
Lapse=rep(c("Y","N"),5), stringsAsFactors = FALSE)
Большое спасибо! Ваш код короткий и очень эффективный. ОЧЕНЬ ПРИЗНАН!!!!
purrr::map_dblпередает только один аргумент, я думаю, вам нужноpmap, как вwith(data_frame_Policyholders, purrr::pmap_dbl(list(Policy_Class, Risk, Lapse), function_example)). (Есть и другиеpmap_*варианты.)