【问题标题】:how to concatenate each record within one observation in SAS如何在SAS的一个观察中连接每条记录
【发布时间】:2011-03-25 06:34:50
【问题描述】:

我想知道是否可以使用 SAS 代码连接一次观察中的每条记录。 例如

这是原始数据集

第一个名字第二个名字第三个名字.....姓氏

   abc   def      ghi .....     xyz

现在我想添加一个变量,它连接从 1st_name 到 last_name 的所有值——如果可能的话,用特定的分隔符分隔。

预期结果

1st_name 2nd_name 3rd_name .....last_name   all_name

   abc   def      ghi .....     xyz     abcdefg...xyz 

当然有一种方法

data name;
  set name;
  length all_name $ 30;
  all_name=1st_name||2nd_name....||last_name;
run;

但是,如果有数百个变量,事情会变得很糟糕。所以问题是如何自动完成,而不必指定变量名、数字等。

期待 SAS 专家的解答:)

【问题讨论】:

    标签: sas


    【解决方案1】:

    下面的代码应该可以工作。您需要根据自己的情况对其进行调整。它所做的是创建一个包含所有字符变量的数组。如果名称包含值名称,它将被连接起来。 catx 函数修剪值并使用第一个参数作为分隔符。请注意,SAS 字段的最大大小为 32767 个字符,因此连接数百个变量可能会导致错误。

    data concatnames (drop=i);
     * maximum field length, will contain concatenated names;
     attrib all length=$32767.;
     * read source dataset;
     set names;
     * create array with with character fields;
     array char_array {*} _character_;
     * loop through array;
     do i = 1 to dim(char_array);
      * if fieldname contains name, then add to all with a dash as seperator;
      if (index(vname(char_array{i}),"name") ne 0) then all = catx("-",all,char_array{i});
     end;
    run;
    

    【讨论】:

    • +1 这是一个很好的答案、很好的解释和一个优雅、通用的解决方案。我喜欢你在这里,劳伦特!
    • 如果您不需要在每个连接值之间使用 '-' 分隔符,请将 catx("-",all,char_array{i}) 更改为 cat(all,char_array{i})。
    • 再次感谢您,劳伦特。我同意 Frog 的观点,因为它确实很有用。干杯!
    【解决方案2】:

    如果要连接的变量是有序的,您可以使用带有变量列表(双破折号)的“of”语法来简化代码。

    data name;
      length all_name $32767.;
      set name;
      allname=cats(of first_name--last_name);
    run;
    

    【讨论】:

    • 这可能是一个旧答案,但你在一个相关问题上为我节省了很多时间,我不得不发帖表示感谢!
    • 我使用此代码进行连接并且效果很好,但是如何在此代码中插入名字和姓氏之间的逗号?
    • @SQUISH - 相关的 catx() 函数允许您在连接中包含分隔符 - 但此分隔符将添加到所有元素之间。不确定这是否是您需要的,但可能值得一试。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 2019-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多