编辑分类数据以保持一致性

时间:2013-08-06 15:09:35

标签: sas

我有100万行+数据,而列的是channel_name。收集数据的人似乎并不关心他们在大约10种不同的变体中输入了一个通道,其中很多包含@符号。谷歌搜索没有给我任何体面的文档,任何人都可以指导我做一些有用的东西吗?

1 个答案:

答案 0 :(得分:1)

在某种程度上,答案必须是“它取决于”。您的实际数据将决定最佳解决方案;并且可能没有一个真正的解决方案 - 您可能需要尝试一些事情,并且可能会有比您想要的更多的手动工作。

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

例如,您可能将'渠道'作为零售店:     数据有;     infile datalines trunco​​ver;     输入@ 1频道8美元。     datalines;     百思买     百思买     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格式然后格式化为西尔斯,而不是更改字符格式的存储值 - 如果/当KMart再次拆分时,甚至更容易回滚。

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