sas - 当中间名出现时,将全名分为名字和姓氏
问题描述
我想看看这在 SAS 中是否可行。我有一个国会议员的数据集,想将全名分成名字和名字。然而,有时他们似乎列出了他们中间的首字母或名字。它来自一个 .txt 文件。
Norton, Eleanor Holmes [D-DC] 16 0 440 288 0
Cohen, Steve [D-TN] 15 0 320 209 0
Schakowsky, Janice D. [D-IL] 6 0 289 186 0
McGovern, James P. [D-MA] 8 1 252 139 0
Clarke, Yvette D. [D-NY] 7 0 248 166 0
Moore, Gwen [D-WI] 2 3 244 157 1
Hastings, Alcee L. [D-FL] 13 1 235 146 0
Raskin, Jamie [D-MD] 8 1 232 136 0
Grijalva, Raul M. [D-AZ] 9 1 228 143 0
Khanna, Ro [D-CA] 4 0 223 150 0
解决方案
再会,
SAS 在字符串方面有点笨拙。然而它是可以做到的。正如其他人所提到的,这是定义的逻辑,这是真正困难的部分。
从一些原始数据开始......
data begin;
input raw_str $ 1-100;
cards;
Norton, Eleanor Holmes [D-DC] 16 0 440 288 0
Cohen, Steve [D-TN] 15 0 320 209 0
Schakowsky, Janice D. [D-IL] 6 0 289 186 0
McGovern, James P. [D-MA] 8 1 252 139 0
Clarke, Yvette D. [D-NY] 7 0 248 166 0
Moore, Gwen [D-WI] 2 3 244 157 1
Hastings, Alcee L. [D-FL] 13 1 235 146 0
Raskin, Jamie [D-MD] 8 1 232 136 0
Grijalva, Raul M. [D-AZ] 9 1 228 143 0
Khanna, Ro [D-CA] 4 0 223 150 0
; run;
首先,我选择领先的名称,直到第一个括号。
计算字符串的数量
data names;
set begin;
names_only = scan(raw_str,1,'[');
Nr_of_str = countw(names_only,' ');
run;
假设:第一刺是姓氏。
如果只有 2 个字符串,第一个和最后一个使用 scan 和 substring 很容易:
data names2;
set names;
if Nr_of_str = 2 then do;
last_name = scan(names_only, 1, ' ');
_FirstBlank = find(names_only, ' ');
first_name = strip(substr(names_only, _FirstBlank));
end;
run;
假设:只有 3 个字符串。方法1.中间名中有点。过滤掉它。方法二、中间名比实名短:
data names3;
set names2;
if Nr_of_str > 2 then do;
last_name = scan(names_only, 1, ' '); /*this should still hold*/
_FirstBlank = find(names_only, ' '); /*Substring approach */
first_name = strip(substr(names_only, _FirstBlank));
second_str = scan(names_only, 2, ' ');
third_str = scan(names_only, 3, ' ');
if find(second_str,'.') = 0 then /*1st approch */
first_name = scan(names_only, 2, ' ');
else
first_name = scan(names_only, 3, ' ');
if len(second_str) > len(second_str) then /*2nd approch */
first_name = second_str;
else
first_name = third_str;
end;
run;
推荐阅读
- c# - 使用 ASP.net 核心身份 MVC 记录登录用户的 IP
- javascript - 在 TypeScript 中按值类型排除对象键
- pascal - 如何编写指数函数 (e^x)?
- docker - 在创建的网络中,docker 容器内没有互联网
- php - Woocommerce 税在更新后不起作用
- pdf - 是否有一些快速的魔术技巧可以通过在文本编辑器中编辑 PDF 来从 pdf 文件中删除数字签名表单字段?
- c# - Xamarin c# 无法调用 Google Gson FromJson
- java - 运行 jar 时出现 FileNotFoundException
- python - 如何修复“你有 0.9.3 需要 mysqlclient 1.3.13 或更新版本”?
- r - group_by 并用不同的函数汇总到几列