以下是我的数据样本(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语句以将列a
映射到列b
时,基本上数字才会被交换。在我的完整数据中有很多这样的情况。
所以,我的问题是识别副本并以某种方式删除其中一个重复项(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
答案 0 :(得分: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置于上面某些重复的行中,并且在唯一的行中为空。
答案 1 :(得分: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