比较组中的两个ID并输出R中的匹配项

时间:2018-04-05 19:21:44

标签: r duplicates

以下是显示不同国家/地区之间人际关系的数据框的顶部。这些国家是边境墙很高的小型警察国家。这意味着来自ego_id 1的ego_country 永远不会与另一个alter_id中显示的ego_country相关联。为方便起见,我在alter_id's附近放置了违反此逻辑的括号。完整的数据框长约100k行,包括120个国家的观测资料。

ego_id  alter_id    ego_country
120     121         1
120     122         1
121     120         1
122     122         1
122     123         1
122    [121]        1
123     120         1
123     121         1
214     217         2
214     218         2
214    [121]        2
217     214         2
217     218         2
218     214         2
320     322         3
...     ...         ...

我需要检查是否违反了上面指定的逻辑,并输出alter_id出现在多个ego_country中的行。这样做有哪些方法?

1 个答案:

答案 0 :(得分:1)

这篇文章从几个不同的角度来看待你的问题,最后是“如果在不同的国家有欺骗,只标记原始数据框架”。我把它分成几个不同的部分,这样你就能更好地确定如何将这些解决方案映射到你原来的问题:

在不同国家/地区查找alter_id的欺骗行为:

> library(dplyr)
> z <- ego %>% group_by(alter_id,ego_country) %>% summarize(count=n()) 
> duplicated(z$alter_id)
[1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
> z[duplicated(z$alter_id),]
# A tibble: 1 x 3
# Groups:   alter_id [1]
  alter_id ego_country count
     <int>       <int> <int>
1      121           2     1

或者缩小到单独的重复alter_id

> z[duplicated(z$alter_id),]$alter_id
[1] 121

制作一个标记傻瓜的列:

> ego %>% group_by(alter_id,ego_country) %>% summarize(count=n()) %>% 
               mutate(dupes=duplicated(alter_id))
# A tibble: 9 x 4
# Groups:   alter_id [8]
  alter_id ego_country count dupes
     <int>       <int> <int> <lgl>
1      120           1     2 FALSE
2      121           1     3 FALSE
3      121           2     1 TRUE 
4      122           1     2 FALSE
5      123           1     1 FALSE
6      214           2     2 FALSE
7      217           2     1 FALSE
8      218           2     2 FALSE
9      322           3     1 FALSE

z中识别出欺骗后,您还可以使用字段更改原始数据框,以标记该观察是否出现在另一个国家/地区。您会注意到alter_id 121只有> dupe_id <- z[duplicated(z$alter_id),]$alter_id > ego %>% mutate(dupes=ifelse(alter_id %in% dupe_id,"TRUE","FALSE")) ego_id alter_id ego_country dupes 1 120 121 1 TRUE 2 120 122 1 FALSE 3 121 120 1 FALSE 4 122 122 1 FALSE 5 122 123 1 FALSE 6 122 121 1 TRUE 7 123 120 1 FALSE 8 123 121 1 TRUE 9 214 217 2 FALSE 10 214 218 2 FALSE 11 214 121 2 TRUE 12 217 214 2 FALSE 13 217 218 2 FALSE 14 218 214 2 FALSE 15 320 322 3 FALSE 在多个国家/地区出现时才会被标记:

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <string-array name="name">
     <item>Rishabh</item>
     <item>starboy</item>
     <item>jon</item>
     </string-array>
</resources>