SAS将数据转换为长格式

时间:2018-06-11 03:49:53

标签: sas transpose proc

我有以下数据集,希望将其转换为长格式:

data have ;
  input Height $ Front Middle Rear ;
  cards;
  Low    125 185 126
  Low    143 170 136
  Low    150 170 129
  Low    138 195 136
  Low    149 162 147
  Medium 141 176 128
  Medium 137 161 133
  Medium 145 167 148
  Medium 150 165 145
  Medium 130 184 141
  High   129 157 149
  High   141 152 137
  High   148 186 138
  High   130 164 126
  High   137 176 138
  ;
run;

这里的高度是低,中,高。位置是前,中,后。数值是书架上书籍的位置和高度的价格。

我希望将数据集转换为带有列的长格式:

高度,位置和价格

以下代码仅允许我将位置转换为长格式。我应该如何同时转换高度?

data bookp;
set bookp;
dex = _n_; 
run;

proc sort data=bookp;
by dex;
run;

proc transpose data=bookp
out=bookpLong (rename=(col1=price _name_= location )drop= _label_ dex);
var front middle rear;
by dex; 
run;

1 个答案:

答案 0 :(得分:1)

我认为你只需要在BY语句中包含HEIGHT。

首先,让我们将您的示例数据转换为SAS数据集。

    function findSec()
local secs = {}

local toSearch = game:GetService("Players").LocalPlayer.PlayerGui:WaitForChild("Backpack").Area.Inv:GetChildren()
for i,v in pairs(toSearch) do
    local ocu = v:FindFirstChild("Occupied")
    local lock = v:FindFirstChild("Locked")

    if ocu.Value == false and lock.Value == false then
        table.insert(secs, v)
    end
end
end

function giveOre(oreType)
local sec = findSec()
local toSet = sec[1]

toSet.Occupied = true
toSet.Locked = true
toSet.Ore = oreType
end

rem.OnClientEvent:connect(function(oreType)
giveOre(oreType)
end)

现在让我们添加一个标识符来唯一标识每一行。请注意,如果您真的正在使用数据步骤读取数据,则可以在读取数据的同一步骤中执行此操作。

data have ;
  input Height $ Front Middle Rear ;
cards;
 Low    125 185 126
 Low    143 170 136
 Medium 141 176 128
 Medium 137 161 133
 High   129 157 149
 High   141 152 137
;

现在我们可以转置。

data with_id ;
  row_num+1;
  set have;
run;

结果:

proc transpose data=with_id out=want (rename=(_name_=Location col1=Price));
  by row_num height ;
  var front middle rear ;
run;