0

这是我的数据样本 (n>3000),它将两个数字联系在一起:

id  a       b
1   7028344 7181310
2   7030342 7030344
3   7030354 7030353
4   7030343 7030345
5   7030344 7030342
6   7030364 7008059
7   7030659 7066051
8   7030345 7030343
9   7031815 7045692
10  7032644 7102337

现在,问题是 id=2 是 id=5 的副本,而 id=4 是 id=8 的副本。因此,当我尝试编写 if-then 语句将 column 映射a到 columnb时,基本上数字只是被交换了。在我的完整数据中有很多这样的案例。

所以,我的问题是识别重复项并以某种方式删除其中一个重复项(id=2 或 id=5)。我最好在 Excel 中执行此操作,但我也可以使用 SQL Server 或 SAS。

先感谢您。如果我的问题不清楚,请发表评论。

我想要的是:

id  a       b
1   7028344 7181310
2   7030342 7030344
3   7030354 7030353
4   7030343 7030345
6   7030364 7008059
7   7030659 7066051
9   7031815 7045692
10  7032644 7102337
4

2 回答 2

2

各种各样的方法来做到这一点。

在 SAS 或 SQL 中,这很简单(对于 SQL Server,SQL 部分应该相同或几乎相同):

data have;
input id a b;
datalines;
1   7028344 7181310
2   7030342 7030344
3   7030354 7030353
4   7030343 7030345
5   7030344 7030342
6   7030364 7008059
7   7030659 7066051
8   7030345 7030343
9   7031815 7045692
10  7032644 7102337
;;;;
run;

proc sql undopolicy=none;
delete from have H where exists (
  select 1 from have V where V.id < H.id
    and (V.a=H.a and V.b=H.b) or (V.a=H.b and V.b=H.a)
);
quit;

excel解决方案将需要创建一个附加列,我相信这两个字符串的连接按顺序排列(任何顺序都可以),然后查找是否是具有该值的第一行。我认为如果不创建额外的列(或使用 VBA,如果你可以使用它也将有一个相当简单的解决方案),你就无法做到这一点。

编辑:实际上,无需创建新列即可使用 excel 解决方案(好吧,您需要将此公式放在某处,但没有其他附加列)。

=IF(OR(AND(COUNTIF(B$1:B1,B2),COUNTIF(C$1:C1,C2)),AND(COUNTIF(B$1:B1,C2),COUNTIF(C$1:C1,B2))),"DUPLICATE","")

假设 ID 在 A、B 和 C 中包含值(并且没有标题行)。该公式进入第二行(即 B2/C2 值),然后扩展到其他行(因此第 36 行的数组为 B1:B35 和 C1:C35 等)。这会将 DUPLICATE 放在与上述内容重复的行中,而在唯一的行中放置空白。

于 2012-12-07T20:49:23.790 回答
0

我还没有对此进行测试,但这里有一些值得深思的地方,您可以将表加入到自身中并获取具有重复项的 ID

 SELECT
     id, a, b
 FROM
    [myTable]
    INNER JOIN ( SELECT id, a, b FROM [myTable] ) tbl2
        ON [myTable].a = [tbl2].b
           OR [myTable].b = tbl2.a
于 2012-12-07T20:51:27.260 回答