以下是显示不同国家/地区之间人际关系的数据框的顶部。这些国家是边境墙很高的小型警察国家。这意味着来自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
中的行。这样做有哪些方法?
答案 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>