我有数据集,有国家,玉米和棉花。我想创建一个新的变量,即玉米玉米产量(相对于该国玉米产量的州玉米产量的百分比)。 Cotton_pct也是一样。数据 样本:(数字是不是真实)使用列的总和,创建一个新的变量
State Corn Cotton
TX 135 500
AK 120 350
...
谁能帮助?
我有数据集,有国家,玉米和棉花。我想创建一个新的变量,即玉米玉米产量(相对于该国玉米产量的州玉米产量的百分比)。 Cotton_pct也是一样。数据 样本:(数字是不是真实)使用列的总和,创建一个新的变量
State Corn Cotton
TX 135 500
AK 120 350
...
谁能帮助?
您可以使用简单的Proc SQL
来做到这一点。让数据集是“测试”,
Proc sql ;
create table test_percent as
select *,
Corn/sum(corn) as Corn_Pct format=percent7.1,
Cotton/sum(Cotton) as Cotton_Pct format=percent7.1
from test
;
quit;
如果你有很多列,您可以使用Arrays
和do loops
以每次自动生成百分比。
我已经计算的总列在Inner Query
,然后使用Cross Join
嘿尝试这一点,总在外部查询计算中使用: -
/*My Dataset */
Data Test;
input State $ Corn Cotton ;
cards;
TK 135 500
AK 120 350
CK 100 250
FG 200 300
run;
/*Code*/
Proc sql;
create table test_percent as
Select a.*, (corn * 100/sm_corn) as Corn_pct, (Cotton * 100/sm_cotton) as Cotton_pct
from test a
cross join
(
select sum(corn) as sm_corn ,
sum(Cotton) as sm_cotton
from test
) b ;
quit;
/*My Output*/
State Corn Cotton Corn_pct Cotton_pct
TK 135 500 24.32432432 35.71428571
AK 120 350 21.62162162 25
CK 100 250 18.01801802 17.85714286
FG 200 300 36.03603604 21.42857143
在这里,你可以选择使用proc means
替代和data step
:
proc means data=test sum noprint;
output out=test2(keep=corn cotton) sum=corn cotton;
quit;
data test_percent (drop=corn_sum cotton_sum);
set test2(rename=(corn=corn_sum cotton=cotton_sum) in=in1) test(in=in2);
if (in1=1) then do;
call symput('corn_sum',corn_sum);
call symput('cotton_sum',cotton_sum);
end;
else do;
Corn_pct = corn/symget('corn_sum');
Cotton_pct = cotton/symget('cotton_sum');
output;
end;
run;
您对您发布的样本数据的期望值是什么?你尝试了什么?结果与你想要的有什么不同? – Tom
我应该得到两个新的列。起初我尝试过[Corn_pct =(玉米/总和(玉米))* 100;],但这只给了我100.我没有意识到,只有一个变量在总和中,我只是把这个号码拿回来。我知道有办法做到这一点,我只是不记得它。 –