在 SAS 中使用 "PROC FORMAT" 重新排列字符列
Rearrange character column using "PROC FORMAT" in SAS
我想获取以下数据变量:
"Nebraska-Iowa"
"Washington-Arkansas"
"Illinois-Utah"
并对其进行转换,使其将连字符周围的字符组按字母顺序排列:
"Iowa-Nebraska"
"Arkansas-Washington"
"Illinois-Utah"
有没有简单的方法来做到这一点?我需要围绕连字符拆分字符串,必要时重新排列,然后再粘贴回去。
更新
在研究了 Matthew 的回答之后,我决定将其推广到具有以下数据集的任意数量的州:
Nebraska-Iowa
Washington-Arkansas-Texas
Illinois-Utah
Colorado
这是我要构建的代码。我正在苦苦挣扎的是构建一个我循环遍历的数组,拉出适当的单词,然后在排列后将它们粘贴回一起。请帮忙!
/*Example dataset*/
data have;
format text .;
input text;
datalines;
Nebraska-Iowa
Washington-Arkansas-Texas
Illinois-Utah
Colorado
run;
/*Rearrange strings in dataset*/
data arrangestrings;
set have;
length result ;
howmanyb = countc(text,'-');
howmany = howmanyb + 1;
array state[howmany] _character_;
do i=1 to howmany;
state[i] = scan(text, i, '-');
end;
call sortc(of state(*));
result = catx("-", state[*]);
keep result;
run;
我认为您不需要为这样的任务定义用户定义的格式。内置的 scan
方法是你的朋友:
data have;
format text .;
input text;
datalines;
Nebraska-Iowa
Washington-Arkansas
Illinois-Utah
run;
data want;
set have;
length word1 word2 result ;
word1 = scan(text, 1, '-');
word2 = scan(text, 2, '-');
result = ifc(word1 <= word2, text, catx('-', word2, word1));
run;
proc print data=want;
run;
如果您不熟悉我使用的内置函数(scan
、ifc
、catx
),请查看文档:
我想获取以下数据变量:
"Nebraska-Iowa"
"Washington-Arkansas"
"Illinois-Utah"
并对其进行转换,使其将连字符周围的字符组按字母顺序排列:
"Iowa-Nebraska"
"Arkansas-Washington"
"Illinois-Utah"
有没有简单的方法来做到这一点?我需要围绕连字符拆分字符串,必要时重新排列,然后再粘贴回去。
更新
在研究了 Matthew 的回答之后,我决定将其推广到具有以下数据集的任意数量的州:
Nebraska-Iowa
Washington-Arkansas-Texas
Illinois-Utah
Colorado
这是我要构建的代码。我正在苦苦挣扎的是构建一个我循环遍历的数组,拉出适当的单词,然后在排列后将它们粘贴回一起。请帮忙!
/*Example dataset*/
data have;
format text .;
input text;
datalines;
Nebraska-Iowa
Washington-Arkansas-Texas
Illinois-Utah
Colorado
run;
/*Rearrange strings in dataset*/
data arrangestrings;
set have;
length result ;
howmanyb = countc(text,'-');
howmany = howmanyb + 1;
array state[howmany] _character_;
do i=1 to howmany;
state[i] = scan(text, i, '-');
end;
call sortc(of state(*));
result = catx("-", state[*]);
keep result;
run;
我认为您不需要为这样的任务定义用户定义的格式。内置的 scan
方法是你的朋友:
data have;
format text .;
input text;
datalines;
Nebraska-Iowa
Washington-Arkansas
Illinois-Utah
run;
data want;
set have;
length word1 word2 result ;
word1 = scan(text, 1, '-');
word2 = scan(text, 2, '-');
result = ifc(word1 <= word2, text, catx('-', word2, word1));
run;
proc print data=want;
run;
如果您不熟悉我使用的内置函数(scan
、ifc
、catx
),请查看文档: