¡Por supuesto! A continuación, agrego comentarios para explicar lo que hace cada paso en el código SAS que proporcionaste:

data salida;            /* Crea un nuevo conjunto de datos llamado "salida" */
    set entrada;        /* Copia los datos del conjunto de datos "entrada" al conjunto de datos "salida" */
    length saldo_recuperado;   /* Define una variable numérica llamada "saldo_recuperado" */
    if _N_ = 1 then       /* Si esta es la primera observación del conjunto de datos "entrada" */
    do;
      declare hash saldos_rec(dataset: "saldos_recuperados(where=(&fecha_negocio lt fecha_fv and &fecha_negocio ge fecha_iv))");  /* Crea una tabla hash a partir de los datos del conjunto de datos "saldos_recuperados" que cumplen la condición especificada en el "where" */
      saldos_rec.definekey('sk_contrato');   /* Define la variable "sk_contrato" como la clave de la tabla hash */
      saldos_rec.definedata('sk_contrato', 'saldo_recuperado');  /* Define las variables "sk_contrato" y "saldo_recuperado" como los datos a extraer de la tabla hash */
      saldos_rec.definedone();    /* Completa la definición de la tabla hash */
      call missing(saldo_recuperado);    /* Define la variable "saldo_recuperado" como perdida (missing) */
    end;
    rc = saldos_rec.find();    /* Busca el valor correspondiente a la clave "sk_contrato" en la tabla hash "saldos_rec" y devuelve un valor de retorno "rc" */
    saldo_impagado=sum(saldo_impagado,-saldo_recuperado);  /* Calcula la suma acumulada de "saldo_impagado" y "saldo_recuperado" para cada observación */
run;                         /* Finaliza la definición del conjunto de datos "salida" */

proc sort data=salida;      /* Ordena el conjunto de datos "salida" en orden descendente por la variable "sk_contrato" */
by sk_contrato descending;
run;                         /* Ejecuta el procedimiento SORT para reordenar el conjunto de datos "salida" */
แน่นอน! ด้านล่างนี้ ฉันเพิ่มความคิดเห็นเพื่ออธิบายว่าแต่ละขั้นตอนทำอะไรในโค้ด SAS ที่คุณให้มา: เอาต์พุตข้อมูล; /* สร้างชุดข้อมูลใหม่ชื่อ "output" */ set input; /* คัดลอกข้อมูลจากชุดข้อมูล "อินพุต" ไปยังชุดข้อมูล "เอาต์พุต" */ length recovery_balance; /* กำหนดตัวแปรตัวเลขที่เรียกว่า "recovered_balance" */ ถ้า _N_ = 1 ดังนั้น /* หากนี่เป็นข้อสังเกตแรกของชุดข้อมูล "input" */ do; ประกาศแฮช rec_balances (ชุดข้อมูล: "recovered_balances (โดยที่ = (&business_date lt fv_date และ &business_date ge iv_date))"); /* สร้างตารางแฮชจากข้อมูลในชุดข้อมูล "recovered_balances" ที่ตรงตามเงื่อนไขที่ระบุใน "where" */ rec_balances.definekey('sk_contract'); /* กำหนดตัวแปร "sk_contract" เป็นคีย์ของตารางแฮช */ balances_rec.defata('sk_contract', 'balance_recovered'); /* กำหนดตัวแปร "sk_contract" และ "recovered_balance" เป็นข้อมูลที่จะแยกจากตารางแฮช */ rec_balances.defone(); /* กรอกคำจำกัดความของตารางแฮชให้สมบูรณ์ */ โทรขาดหายไป (recovered_balance); /* กำหนดตัวแปร "recovered_balance" ว่าหายไป */ end; rc = rec_balances.find(); /* ค้นหาค่าที่สอดคล้องกับคีย์ "sk_contract" ในตารางแฮช "saldos_rec" และส่งคืนค่าส่งคืน "rc" */ unpaid_balance = sum(unpaid_balance,-recovered_balance); /* คำนวณผลรวมสะสมของ "unpaid_balance" และ "recovered_balance" สำหรับการสังเกตแต่ละครั้ง */ run; /* สิ้นสุดคำจำกัดความของชุดข้อมูล "output" */ proc sort data=output; /* เรียงลำดับชุดข้อมูล "เอาต์พุต" ตามลำดับจากมากไปน้อยตามตัวแปร "sk_contract" */ โดย sk_contract จากมากไปน้อย; วิ่ง; /* ดำเนินการตามขั้นตอน SORT เพื่อเรียงลำดับชุดข้อมูล "เอาต์พุต" ใหม่ */
spam fails_task lang_mismatch pii not_appropriate hate_speech sexual_content quality toxicity humor helpfulness creativity violence