Я переписываю сценарий SAS на R, и мне было интересно, есть ли более упорядоченный способ выполнения нескольких условных операторов
У меня есть фрейм данных с почти 900 000 строк и 44 столбцами, поэтому цикл for работает вечно. Ниже приведено подмножество моих данных с версией моего сценария, который я буду использовать. Одна из основных проблем, с которыми я сталкиваюсь, заключается в том, как выполнить строки 7-10 в операторе if для создания значений, а затем использовать их в иерархии.
dt <- data.frame(v1 = c(0.0449, 0.0462, 0.1899, 0.2074, 0.1778),
v2 = c(0.8637, 0.9417, 0.4258, 0.7083, 0.6962),
v3 = c(0,0, 0.2501, 0.0474, 0.126))
for(i in seq_len(nrow(dt))){
if(sum(dt$v1[i],dt$v2[i],dt$v3[i], na.rm = T) >= 0.5){
dt$scale[i] = 1/sum(dt$v1[i],dt$v2[i],dt$v3[i], na.rm = T)
dt$v1_scale[i] <- dt$v1[i] * dt$scale[i]
dt$v2_scale[i] <- dt$v2[i] * dt$scale[i]
dt$v3_scale[i] <- dt$v3[i] * dt$scale[i]
if(dt$v1_scale[i] >= 0.75){
dt$cat[i] <- "D"
} else if(dt$v2_scale[i] >= 0.9){
dt$cat[i] <- "F2"
}else if(dt$v2_scale[i] >= 0.75){
dt$cat[i] <- "F1"
} else if(dt$v3_scale[i] >= 0.75){
dt$cat[i] <- "A"
} else if(dt$v3_scale[i] >= max(dt$v1_scale[i], dt$v2_scale[i], na.rm = T)){
if(dt$v1_scale[i] >= dt$v2_scale[i]){
dt$cat[i] <- "B"
} else{
dt$cat[i] <- "C"
}
} else if(dt$v1_scale[i] >= max(dt$v3_scale[i], dt$v2_scale[i], na.rm = T)){
if(dt$v3_scale[i] >= dt$v2_scale[i]){
dt$cat[i] <- "B"
} else{
dt$cat[i] <- "E"
}
} else if(dt$v3_scale[i] >= dt$v1_scale[i]){
dt$cat[i] <- "C"
} else{
dt$cat[i] <- "E"
}
}
}
Недавно я пытался узнать больше об API data.table, поэтому мне было бы интересно узнать, возможно ли это с API data.table. Честно говоря, что-нибудь, чтобы сделать это быстрее, будет с благодарностью.
Приветствия