Использование логических операторов для сокращения кода переменной - PullRequest
2 голосов
/ 29 марта 2019

Я пытаюсь закодировать переменную для метаболического синдрома с 5 критериями Ожирение (3 возможных бинарных исхода) Инсулинорезистентность (3 возможных бинарных исхода) Дислипидемия TGC (3 возможных бинарных исхода) Дислипидемия ЛПВП (2 возможных бинарных исхода) и гипертония(4 возможных бинарных результата).Если субъект положительный по любому из этих 5 критериев, он будет считаться положительным по метаболическому синдрому.

Я попытался объединить их в C5,3, учитывая, что все субъекты, положительные по 4 или 5 критериям, будут охваченыпо доверенности.Но мой код стал слишком большим, так как я пытался охватить любую возможную комбинацию.Можно ли уменьшить размер моего кода, используя приоритет оператора, чтобы сделать его более компактным?

METSYN <- array (NA,dim = dim(BancoTOTAL)[1] )
for (i in 1:791){  
  METSYN[i] <- ifelse ( #OID1 OID2
    BancoTOTAL$sexo.x[i] == 0 && BancoTOTAL$cintura.x[i] > 90 
                       && BancoTOTAL$Glic[i] >= 100 
                       && BancoTOTAL$TRIG[i] > 150 
                       |BancoTOTAL$sexo.x[i] == 1 && BancoTOTAL$cintura.x[i] > 80 
                       && BancoTOTAL$Glic[i] >= 100 
                       && BancoTOTAL$TRIG[i] > 150 
                       |BancoTOTAL$IMC[i] > 30
                       && BancoTOTAL$Glic[i] >= 100 
                       && BancoTOTAL$TRIG[i] > 150

and soon
, 1, 0)
}

Вот мой переработанный код с использованием промежуточных категориальных переменных

METSYN <- array(NA, dim = dim(BancoTOTAL)[1])
    for (i in 1:(dim(BancoTOTAL)[1])){
      METSYN[i] <- ifelse(
        #OID1
        BancoTOTAL$obesity[i] == 1
        && BancoTOTAL$insulinR[i] == 1
        && BancoTOTAL$dyslipidemiaTGC[i] == 1
        #OID2
        |BancoTOTAL$obesity[i] == 1
        && BancoTOTAL$insulinR[i] == 1
        && BancoTOTAL$dyslipidemiaHDL[i] == 1
        #OIH
        |BancoTOTAL$obesity[i] == 1
        && BancoTOTAL$insulinR[i] == 1
        && BancoTOTAL$HBP[i] == 1
        #OD1D2
        |BancoTOTAL$obesity[i] == 1
        && BancoTOTAL$dyslipidemiaTGC[i] == 1
        && BancoTOTAL$dyslipidemiaHDL[i] == 1
        #OD1H
        |BancoTOTAL$obesity[i] == 1
        && BancoTOTAL$dyslipidemiaTGC[i] == 1
        && BancoTOTAL$HBP[i] == 1
        #OD2H
        |BancoTOTAL$obesity[i] == 1
        && BancoTOTAL$dyslipidemiaHDL[i] == 1
        && BancoTOTAL$HBP[i] == 1
        #ID1D2
        |BancoTOTAL$obesity[i] == 1
        && BancoTOTAL$dyslipidemiaTGC[i] == 1
        && BancoTOTAL$dyslipidemiaHDL[i] == 1
        #ID1H
        |BancoTOTAL$insulinR[i] == 1
        && BancoTOTAL$dyslipidemiaTGC[i] == 1
        && BancoTOTAL$HBP[i] == 1
        #ID2H
        |BancoTOTAL$insulinR[i] == 1
        && BancoTOTAL$dyslipidemiaHDL[i] == 1
        && BancoTOTAL$HBP[i] == 1
        #D1D2H
        |BancoTOTAL$dyslipidemiaTGC[i] == 1
        && BancoTOTAL$dyslipidemiaHDL[i] == 1
        && BancoTOTAL$HBP[i] == 1
        , 1, 0 )
    }

1 Ответ

0 голосов
/ 29 марта 2019

Это работает для вас? (используя ваши промежуточные категориальные переменные)

METSYN <- unlist(lapply(1:dim(BancoTOTAL)[1], function (x){
  (BancoTOTAL$obesity[x]+BancoTOTAL$insulinR[x]+BancoTOTAL$dyslipidemiaTGC[x]+BancoTOTAL$dyslipidemiaHDL[x]+BancoTOTAL$HBP[x])>=3
}))
...