我有一个包含具有特定结构的财务数据的数据集:
|Date |price1 |Date |price2 |...|Date |priceN |
|dd/mm/yy|numeric |dd/mm/yy|numeric |...|dd/mm/yy|numeric |
|dd/mm/yy|numeric |dd/mm/yy|numeric |...|dd/mm/yy|numeric |
|dd/mm/yy|numeric |dd/mm/yy|numeric |...|dd/mm/yy|numeric |
我需要将数据从宽转为长,但首先我必须仅选择第一列(日期)和所有价格列,即所有偶数列。我用 python 做了它,它工作了,所以使用 chat gpt 将其转换为 SAS,但它不起作用,chat gpt 给出以下代码:
data filter_price;
set price;
array columns[*] _all_;
do i=1 to dim(columns);
if mod(i,2)=0 then output;
end;
keep columns:;
run;
上面代码的结果是这样的数据集:
|Date |price1 |Date |price2 |...|Date |priceN |i |
|dd/mm/yy|numeric |dd/mm/yy|numeric |...|dd/mm/yy|numeric |2 |
|dd/mm/yy|numeric |dd/mm/yy|numeric |...|dd/mm/yy|numeric |4 |
|dd/mm/yy|numeric |dd/mm/yy|numeric |...|dd/mm/yy|numeric |6 |
它添加了一列,其中包含类似索引之类的内容,只接受偶数。我需要的结果如下:
|Date |price1 |price2 |...|priceN |
|dd/mm/yy|numeric |numeric |...|numeric |
|dd/mm/yy|numeric |numeric |...|numeric |
|dd/mm/yy|numeric |numeric |...|numeric |
你能帮我吗?我把我用 python 做的东西留给你,以防它有用。
import pandas as pd
# Lee el archivo de precios
df = pd.read_excel("/content/prueba_pivote_precios.xlsm")
# Elimina la primera fila (que no tiene datos)
df.drop(0, axis=0, inplace=True)
# identifica el nombre de las columnas (el nombre válido de las columnas viene cada dos columnas)
names = df.columns.to_list()
names2 = []
for i in range(len(names)):
if i%2!=0:
names2.append(names[i])
# Selecciona las columnas válidas
df2 = df[names2]
# recupera la columna de fechas del data set original
df3["FECHA"] = df.iloc[:, 0]
SAS 中不能有同名的列。
但是,您可以使用以下语句轻松选择具有名称价格的所有列。
data want;
set have;
KEEP DATE PRICE:;
run;
或者如果您想保留一系列变量:
data want;
set have;
KEEP DATE PRICE1-PRICEN;
run;
如果您只想保留价格2、价格4,那就另当别论了。
在 SAS 中寻找“偶数”列是错误的方法。
如果“枢轴”指的是 TRANSPOSE,那么只需使用 ARRAY。我假设所有变量都是数字。
data want;
set have;
array prices _numeric_;
length name $32 price 8;
do index=2 to dim(prices) by 2;
name=vname(prices[index]);
price=prices[index];
output;
end;
keep date index name price;
run;