0

我有 100 万多行数据,其中的列是 channel_name。收集数据的人似乎并不关心他们以大约 10 种不同的方式进入了一个频道,其中很多都包含 @ 符号。谷歌搜索没有给我任何像样的文档,任何人都可以指导我找到有用的东西吗?

4

1 回答 1

1

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

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

例如,您可能将“渠道”作为零售商店:数据有;infile 数据线 trunco​​ver;输入@1 频道 $8.; 数据线;百思买 BestBuy 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 再次分裂时,甚至更容易回滚。

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

于 2013-08-06T15:30:07.567 回答