Sas 编辑分类数据以实现一致性

Sas 编辑分类数据以实现一致性,sas,Sas,我有超过100万行的数据,其中一列是channel_name。收集数据的人似乎并不在意他们以大约10种不同的变体进入了一个频道,其中很多都包含@符号。谷歌搜索没有给我任何像样的文档,有人能告诉我一些有用的东西吗?在某种程度上,答案必须是“视情况而定”。您的实际数据将决定此问题的最佳解决方案;而且可能没有一个真正的解决方案——你可能不得不尝试一些事情,而且可能会有比你想要的更多的手工工作 一种选择是根据您看到的内容构建一种格式。该格式可以将各种值转换为一个一致的值,也可以转换为数字类别(然后用显示

我有超过100万行的数据,其中一列是channel_name。收集数据的人似乎并不在意他们以大约10种不同的变体进入了一个频道,其中很多都包含@符号。谷歌搜索没有给我任何像样的文档,有人能告诉我一些有用的东西吗?

在某种程度上,答案必须是“视情况而定”。您的实际数据将决定此问题的最佳解决方案;而且可能没有一个真正的解决方案——你可能不得不尝试一些事情,而且可能会有比你想要的更多的手工工作

一种选择是根据您看到的内容构建一种格式。该格式可以将各种值转换为一个一致的值,也可以转换为数字类别(然后用显示一致值的格式覆盖)

例如,您可能将“渠道”作为零售商店: 有数据; 填充数据线truncover; 输入@1频道$8。; 数据线; 百思买 百思买 BB ;;;; 运行

所以你可以做两件事中的一件:

proc format;
value $channel
"Best Buy","BB","BestBuy" = "Best Buy";
quit;

data want;
set have;
channel_coded = put(channel,$channel.);
run;
或者你可以:

proc format;
invalue channeli
"Best Buy", "BB","BestBuy" = 1
;
value channelf
1 = "Best Buy"
;
quit;


data want;
set have;
channel_coded = input(channel,CHANNELI.);
format channel_coded channelf.;
run;
这在很大程度上取决于您自己-从长远来看,后者为您提供了更大的灵活性,例如,当Sears和K-Mart合并时,将2和16作为Sears格式,而不是更改字符格式的存储值-如果/当KMart再次拆分时,甚至更容易回滚


不过,这确实需要一些手工工作;在这里,您必须手工编写代码,或者开发一些方法来确定代码是什么。您可以使用proc格式的
other
选项轻松识别新值并将其添加到格式中(可以从数据集而不是手写代码派生),但在一天结束时,您拥有的实际值决定了什么样的解决方案最适合于确定什么是“最佳购买”的实际工作,以及手动解决方案(每次新值出现时,都会由一个人查看并编码)可能最终是最好的。

尝试使用proc SQLPattern matching,因为它属于SAS,Dataflux可能值得一提。它是一种不同的产品(与SAS紧密集成)这正是针对数据清理的,包括您提到的内容。当然,如果这是您遇到此类问题的唯一实例,那么很可能是杀伤力过大。这是一种很好的方法。不仅格式非常有效(内存查找),而且比哈希表更易于“读取”(让其他程序员更好地了解您所做的工作)