楼主: huangyao05
5128 5

[问答] 请问如何合并多列字符变量为一列。(相同则合并,不同则保留) [推广有奖]

  • 0关注
  • 0粉丝

小学生

57%

还不是VIP/贵宾

-

威望
0
论坛币
412 个
通用积分
0
学术水平
0 点
热心指数
2 点
信用等级
0 点
经验
159 点
帖子
5
精华
0
在线时间
7 小时
注册时间
2010-2-6
最后登录
2017-7-7

楼主
huangyao05 发表于 2012-7-23 02:59:09 |AI写论文
50论坛币
请问如何合并多列字符变量为一列,相同的就只记录一次,不同的则保留。
举个例子。

4列的值分别为:
A          B         C          D
Car      Car      Car      Car
Love    Peace  Fight   Fight
5         5           5          6

合并完的结果应该是

A|B|C|D
Car
Love|Peace|Fight
5|6

多谢!


关键词:字符变量 FIGHT Peace Love CAR 如何

本帖被以下文库推荐

沙发
hopewell 发表于 2012-7-23 02:59:10
  1. data raw;
  2.     input A $ B $ C $ D $;
  3. datalines;
  4. Car Car Car Car
  5. Love Peace Fight Fight
  6. 5 5 5 6
  7. ;
  8. data out;
  9.     length result $100;
  10.     set raw;
  11.     array arr $20 a--d;
  12.     do over arr;
  13.         if indexw(result,arr)=0 then result=catx('|',result,arr);
  14.     end;
  15. run;
复制代码
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
huangyao05 + 1 + 1 + 1 这里用find比indexw好。感谢解答!
pobel + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

观钓颇逾垂钓趣 种花何问看花谁

藤椅
huangyao05 发表于 2012-7-23 08:58:32
请问可不可以解释下indexw的用法 比如下面这些例子,我看不太明白。。
s='asdf adog dog';
p='dog  ';
x=indexw(s,p);
put x;

result:
11

s='abcdef x=y';
p='def';
x=indexw(s,p);
put x;

result:
0

x="abc,def@ xyz";
abc=indexw(x, " abc ", "@");
put abc;

result:
0

x="abc,def@ xyz";
comma=indexw(x, ",", "@");
put comma;

result:
0

x='abc,def% xyz';
def=indexw(x, 'def', '%,');
put def;


result:
5

x="abc,def@ xyz";
at=indexw(x, "@", "@");
put at;

result:
0

x="abc,def@ xyz";
xyz=indexw(x, " xyz", "@");
put xyz;


result:

9


另外如果这段想写进macro里面应该怎么改写阿
多谢!

板凳
huangyao05 发表于 2012-7-23 08:59:22
hopewell 发表于 2012-7-23 08:18
请问可不可以解释下indexw的用法 比如下面这些例子,我看不太明白。。
s='asdf adog dog';
p='dog  ';
x=indexw(s,p);
put x;

result:
11

s='abcdef x=y';
p='def';
x=indexw(s,p);
put x;

result:
0

x="abc,def@ xyz";
abc=indexw(x, " abc ", "@");
put abc;

result:
0

x="abc,def@ xyz";
comma=indexw(x, ",", "@");
put comma;

result:
0

x='abc,def% xyz';
def=indexw(x, 'def', '%,');
put def;


result:
5

x="abc,def@ xyz";
at=indexw(x, "@", "@");
put at;

result:
0

x="abc,def@ xyz";
xyz=indexw(x, " xyz", "@");
put xyz;


result:

9


另外如果这段想写进macro里面应该怎么改写阿
多谢!

报纸
YueweiLiu 发表于 2012-7-23 09:41:38
可以再试试find函数:
  1. data have;
  2.     input (var1-var4) ($);
  3. datalines;
  4. A B C D
  5. Car Car Car Car
  6. Love Peace Fight Fight
  7. 5 5 5 6
  8. ;

  9. data want;
  10.         set have;
  11.         length char $ 100;
  12.         array tmp[*] var1-var4;
  13.         do i=1 to dim(tmp);
  14.                 if find(char,tmp[i])=0 then char=catx("|",char,tmp[i]);
  15.         end;
  16.         drop i;
  17. run;
复制代码
已有 2 人评分学术水平 热心指数 信用等级 收起 理由
huangyao05 + 1 + 1 + 1 用find好。但是2楼的解答给我很多启发,还是.
pobel + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

地板
hcydlee 发表于 2012-7-23 10:44:27
huangyao05 发表于 2012-7-23 08:59
请问可不可以解释下indexw的用法 比如下面这些例子,我看不太明白。。
s='asdf adog dog';
p='dog  ';
...
indexw()是从字符串中查找一个word,这个word是前后有分隔符分隔的。返回第一次出现这个word的位置。
第一个例子 在s中查找dog这个word,虽然第一次出现dog是在第7个位置,但是这个dog前面没有分隔符,所以算第二个。


第二个例子,def没有被分隔出来。所以没有找到

第三个例子,指定分隔符是@,abc后面的符号是"," 不是由指定的分隔符分割,所以没有找到。

第四个例子,同第三个例子。

第五个例子,用%和“,”分隔。 def前面是","后面是"@".前后都有分隔符,是一个word.

第六个例子,用@分隔,查找@。

最后一个,前面有@,后面是字符串末尾,是合法的word.

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
huangyao05 + 1 + 1 + 1 非常感谢

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

80 字节以内
不支持自定义 Discuz! 代码

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-1 22:15