簡體   English   中英

如何將數值格式化為第 3 位,同時在 SAS 中將其均勻到第 2 位

[英]how to formatting numeric values to the 3rd digit whilst it evens it to 2nd digit in SAS

我正在嘗試解決 SAS EG 中的數字格式問題,希望您能給我一些支持。

基本上,我收到的帶有數字數據的變量有 3 個十進制數字,但我被要求將這些數據轉換為顯示 3 個數字的格式,但它會將它們平均到第 2 個數字。

我需要實現的是這樣的:

prize_old = 14543.567  prize_new = 14543.570
prize_old = 647473.543 prize_new = 647473.540

此外,如果您看到他們要求我編輯的代碼,最終變量prize_string_n 是字符串,是由符號和數字之間的連接產生的,因此我需要在貓function 之前進行干預。

data new;
set old;
prize_01 = sum(effect_2021_1, effect_trash_T_2021_1, effect_trash_C_2021_1);
prize_02 = sum(effect_2021_2, effect_trash_T_2021_2, effect_trash_C_2021_2);
prize_03 = sum(effect_2021_3, effect_trash_T_2021_3, effect_trash_C_2021_3);
prize_04 = sum(effect_2021_4, effect_trash_T_2021_4, effect_trash_C_2021_4);
prize_05 = sum(effect_2021_5, effect_trash_T_2021_5, effect_trash_C_2021_5);
prize_06 = sum(effect_2021_6, effect_trash_T_2021_6, effect_trash_C_2021_6);
prize_07 = sum(effect_2021_7, effect_trash_T_2021_7, effect_trash_C_2021_7);
prize_08 = sum(effect_2021_8, effect_trash_T_2021_8, effect_trash_C_2021_8);
prize_09 = sum(effect_2021_9, effect_trash_T_2021_9, effect_trash_C_2021_9);
prize_10 = sum(effect_2021_10, effect_trash_T_2021_10, effect_trash_C_2021_10);
prize_11 = sum(effect_2021_11, effect_trash_T_2021_11, effect_trash_C_2021_11);
prize_12 = sum(effect_2021_12, effect_trash_T_2021_12, effect_trash_C_2021_12);

if prize_01 = . then prize_01 = 0;
if prize_02 = . then prize_02 = 0;
if prize_03 = . then prize_03 = 0;
if prize_04 = . then prize_04 = 0;
if prize_05 = . then prize_05 = 0;
if prize_06 = . then prize_06 = 0;
if prize_07 = . then prize_07 = 0;
if prize_08 = . then prize_08 = 0;
if prize_09 = . then prize_09 = 0;
if prize_10 = . then prize_10 = 0;
if prize_11 = . then prize_11 = 0;
if prize_12 = . then prize_12 = 0;

if prize_01 >= 0 then SIGN_01 = '+';
if prize_02 >= 0 then SIGN_02 = '+';
if prize_03 >= 0 then SIGN_03 = '+';
if prize_04 >= 0 then SIGN_04 = '+';
if prize_05 >= 0 then SIGN_05 = '+';
if prize_06 >= 0 then SIGN_06 = '+';
if prize_07 >= 0 then SIGN_07 = '+';
if prize_08 >= 0 then SIGN_08 = '+';
if prize_09 >= 0 then SIGN_09 = '+';
if prize_10 >= 0 then SIGN_10 = '+';
if prize_11 >= 0 then SIGN_11 = '+';
if prize_12 >= 0 then SIGN_12 = '+';

if prize_01 < 0 then SIGN_01 = '-';
if prize_02 < 0 then SIGN_02 = '-';
if prize_03 < 0 then SIGN_03 = '-';
if prize_04 < 0 then SIGN_04 = '-';
if prize_05 < 0 then SIGN_05 = '-';
if prize_06 < 0 then SIGN_06 = '-';
if prize_07 < 0 then SIGN_07 = '-';
if prize_08 < 0 then SIGN_08 = '-';
if prize_09 < 0 then SIGN_09 = '-';
if prize_10 < 0 then SIGN_10 = '-';
if prize_11 < 0 then SIGN_11 = '-';
if prize_12 < 0 then SIGN_12 = '-';

prize_ABS_01 = abs(prize_01);
prize_ABS_02 = abs(prize_02);
prize_ABS_03 = abs(prize_03);
prize_ABS_04 = abs(prize_04);
prize_ABS_05 = abs(prize_05);
prize_ABS_06 = abs(prize_06);
prize_ABS_07 = abs(prize_07);
prize_ABS_08 = abs(prize_08);
prize_ABS_09 = abs(prize_09);
prize_ABS_10 = abs(prize_10);
prize_ABS_11 = abs(prize_11);
prize_ABS_12 = abs(prize_12);

prize_STRING_01 = cats(SIGN_01, vvalue(prize_ABS_01));
prize_STRING_02 = cats(SIGN_02, vvalue(prize_ABS_02));
prize_STRING_03 = cats(SIGN_03, vvalue(prize_ABS_03));
prize_STRING_04 = cats(SIGN_04, vvalue(prize_ABS_04));
prize_STRING_05 = cats(SIGN_05, vvalue(prize_ABS_05));
prize_STRING_06 = cats(SIGN_06, vvalue(prize_ABS_06));
prize_STRING_07 = cats(SIGN_07, vvalue(prize_ABS_07));
prize_STRING_08 = cats(SIGN_08, vvalue(prize_ABS_08));
prize_STRING_09 = cats(SIGN_09, vvalue(prize_ABS_09));
prize_STRING_10 = cats(SIGN_10, vvalue(prize_ABS_10));
prize_STRING_11 = cats(SIGN_11, vvalue(prize_ABS_11));
prize_STRING_12 = cats(SIGN_12, vvalue(prize_ABS_12));
run;

任何建議如何處理? 在此先感謝您的幫助:))

首先 - 您不需要為此使用字符串,您可以使用格式來完成這一切 - 但這是我將如何做您正在做的事情。

  1. 使用 arrays。 請不要將這段代碼寫 12 次,它容易出錯且浪費。
  2. 簡化。 如果您總是希望總和為 0,否則會丟失,請在總和中包含 0! 使用ifc這是三元 if - 基本上,如果它是 true 返回第二個參數,如果 false 返回第三個參數。
  3. 您可以round到正確的位置值,然后put .

這是示例代碼:

data old;
  call streaminit(7);
  array effect[12] effect_2021_01-effect_2021_12;
  array effect_t[12] effect_trash_t_2021_01-effect_trash_t_2021_12;
  array effect_c[12] effect_trash_c_2021_01-effect_trash_c_2021_12;
  do _n_ = 1 to 10;
    do i = 1 to dim(effect);
      effect[i] = rand('Uniform')*100;
      effect_T[i] = rand('Uniform')*100;
      effect_C[i] = rand('Uniform')*100;
    end;
    output;
  end;
run;

data new;
  set old;
  length prize_string_01-prize_String_12 $24;
  array prize[12] prize_01-prize_12;
  array prize_str[12] $ prize_string_01-prize_string_12;
  array effect[12] effect_2021_:;
  array effect_t[12] effect_trash_t_2021_:;
  array effect_c[12] effect_trash_c_2021_:;

  do i = 1 to dim(prize);
    prize[i] = sum(effect[i],effect_t[i],effect_c[i],0);
    sign = ifc(prize[i] ge 0, '+', '-');
    prize_str[i] = cats(sign,put(abs(round(prize[i],.01)),12.3));
  end;
run;

但是-也許我會使用圖片格式,盡管我不確定您是否可以在其中獲得尾隨零; 但你可能可以。 這是一個的開始,無論如何,這至少是前綴......

proc format;
  picture twodecf(round )
    low-<0 = '0000.99' ( prefix='-' )
    0-high = '0000.99' ( prefix='+' )
    ;
quit;

然后可以將其應用於該值,並且可以將 CATS 設為零,至少自動為您應用符號,或者也許有人可以想出如何添加額外的零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM