0

我正在处理一个涉及两个单独 CSV 文件的项目。第一个数据集“Trips”有七列,分别是trip_id、bike_id、duration、from_station_id、to_station_id、容量和用户类型。用户类型是唯一的字符值,其余都是数字。第二个 csv 文件有 station_id 和 station_name。目标是以某种方式合并文件,根据站 id 将第二个 csv 文件中的站名称输入到第一个中的“从”和“到”站部分。我知道这在使用 xlookup 的 excel 中非常容易,但我想知道在 SAS 中处理这个问题的正确方法。

如果这有什么不同,我正在使用 SAS 大学版(免费的在线版)。到目前为止,我们的代码如下:

data DivvyTrips;
    infile '/home/u59304398/sasuser.v94/DivvyTrips.csv' dsd;
    input trip_id
          bikeid
          tripduration
          from_station_id
          to_station_id 
          capacity 
          usertype $;
    title "Trips";
run;

data DivvyStations;
    infile '/home/u59304398/sasuser.v94/Divvy_Stations.csv' dsd;
    input station_id
          station_name $;
    title "Stations";
run;

所有这些都是导入数据。我不认为与排序合并会起作用,因为我们需要从站名和到站名。

4

2 回答 2

0

SAS 使用格式来控制值如何显示为文本。它使用信息来控制文本如何转换为值。

由于您的站 ID 是数字,您可以使用格式来显示站 ID 号的站名称。

您可以为 PROC FORMAT 创建一个 CNTLIN 数据集,以从您的站列表数据集构建格式。要定义数字格式,您只需在 CNTLIN 数据集中包含 FMTNAME、START 和 LABEL 变量。

data format;
   fmtname='STATION';
   set divvystations;
   rename station_id=start station_name=label;
run;
proc format cntlin=format;
run;

现在您可以将格式与您的站变量一起使用。在大多数情况下,您甚至不需要修改数据集,只需告诉 SAS 将格式与您的变量一起使用。

让我们创建一些示例数据:

data DivvyTrips;
    infile cards dsd;
    input trip_id
          bikeid
          tripduration
          from_station_id
          to_station_id 
          capacity 
          usertype :$20.
    ;
cards;
1,1,10,1,2,2,AAA
2,1,20,2,3,1,BBB
;

data DivvyStations;
    infile cards dsd ;
    input station_id
          station_name :$20.
    ;
cards;
1,Stop 1
2,Station 2
3,Airport
;

现在创建 STATION 格式。

data format;
   fmtname='STATION';
   set divvystations;
   rename station_id=start station_name=label;
run;
proc format cntlin=format;
run;

现在让我们打印行程数据并使用新的 STATION 格式显示车站。

proc print data=divvytrips;
  format from_station_id to_station_id station. ;
run;

结果:

                                            from_
                                            station_     to_station_
Obs    trip_id    bikeid    tripduration    id               id         capacity    usertype

 1        1          1           10         Stop 1        Station 2         2         AAA
 2        2          1           20         Station 2     Airport           1         BBB

如果您确实想创建一个新的字符变量,请使用 PUT() 函数。

data want;
  set DivvyTrips;
  from_station = put(from_station_id,station.);
  to_station = put(to_station_id,station.);
run;
于 2021-12-06T21:43:32.003 回答
0

在 SAS 中,当您“查找”值时,您将两个“数组”或在本例中的表连接在一起。

最简单的方法是使用 proc sql 步骤:

proc sql;
    create table DivvyTrips_withnames as
    select
     a.*
    ,b.station_name as from_station_name
    ,c.station_name as to_station_name   
    from DivvyTrips a
    left join DivvyStations b
        on a.from_station_id = b.station_id
    left join DivvyStations c
        on a.to_station_id = c.station_id
    ;
quit;

我们最终不得不对原始表进行 2 次连接,因为我们正在进行 2 次不同的“查找”,from_station_id 和 to_station_id。

于 2021-12-07T20:32:51.893 回答