总而言之,我正在将文档的句子解析为单个句子。我需要更大的理由。
我拥有的是“位置”表,该表为我提供了文档ID(ID)和该文档中一个句子的句子编号(NUM)。我也有一列显示已分析的句子(句子)。
因此,示例表为:
ID NUM SENTENCE
1 3 Hello
1 2 How are you
1 1 Fine
2 2 Thank you
2 1 You're Welcome
3 1 Nice Weather
这意味着在文档1中标识了三个句子,在文档2中标识了两个,依此类推。
问题在于,(ID,NUM)=(1,3)或“ Hello”是指文档1中的第三句,而(ID,NUM)=(1,1)或“ Fine”是指到文档1的第一句,这也是所有其他文档的模式也是如此。
我想颠倒每个ID的NUM顺序,以使句子顺序更清晰。将其输入到程序的其他部分也需要这样做。
基本上,我希望输出表如下所示:
ID NUM SENTENCE
1 1 Hello
1 2 How are you
1 3 Fine
2 1 Thank you
2 2 You're Welcome
3 1 Nice Weather
非常感谢您提供有关执行此操作的帮助。
编辑:
我想更改输出以反映输出表中句子编号的互换。句子的顺序将保持不变。这样,“ Hello”将被表示为句子1,而不是3。
因此,我只希望输出表中每个“ ID”变量值内的“ NUM”变量互换。
答案 0 :(得分:5)
proc sort data=position;
by ID NUM;
run;
编辑:我想我误解了这个问题。您真正想要的是:
proc sort data=position;
by ID descending NUM;
run;
data want (rename=(new_NUM=NUM));
set position (drop=NUM);
by ID;
if first.ID then new_NUM = 1;
output;
new_NUM + 1;
run;
答案 1 :(得分:3)
可以使用SUM语句轻松计算组中的序列号。语法为<variable> + <expression>;
假定该组中的句子值按所需顺序排列,但需要在从1开始的组序号中重新关联。
data want;
set have (rename=(num=num_original));
by ID;
if first.ID then num = 1; else num + 1;
run;
答案 2 :(得分:2)
类似的东西应该可以在Proc SQL中工作
proc sql;
create table want as
select id, (max(num)+1)-num as num, sentence
from have
group by id;