найти дубликаты с сгруппированными переменными - PullRequest
1 голос
/ 15 апреля 2019

У меня есть df, который выглядит так:

Я думаю, он будет работать с dplyr и дубликатами.Однако я не знаю, как обращаться к нескольким столбцам, различая сгруппированные переменные.

from  to  group

1     2   metro
2     4   metro
3     4   metro
4     5   train
6     1   train
8     7   train

Я хочу найти ids, которые существуют более чем в одной group переменной.

Ожидаемый результат для образца df: 1 и 4.Потому что они существуют в метро и в железнодорожной группе.

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 15 апреля 2019

Используя базу R, мы можем split первые два столбца на основе group и найти пересекающееся значение между группами, используя intersect

Reduce(intersect, split(unlist(df[1:2]), df$group))
#[1] 1 4
1 голос
/ 15 апреля 2019

Преобразование данных в длинный формат и подсчет уникальных значений, используя data.table. melt используется для преобразования в длинный формат, а таблица данных позволяет фильтровать в части i в df1[ i, j, k], группировать в части k и pull в части j.

library(data.table)
library(magrittr)
setDT(df1)

melt(df1, 'group') %>% 
  .[, .(n = uniqueN(group)), value] %>% 
  .[n > 1, unique(value)]

# [1] 1 4
1 голос
/ 15 апреля 2019

Мы gather столбцы 'from', 'до' в формате 'long', сгруппированные по 'val', filter группы, имеющие более одного уникального элемента, затем pull уникальные элементы 'val'

library(dplyr)
library(tidyr)
df1 %>% 
   gather(key, val, from:to) %>% 
   group_by(val) %>% 
   filter(n_distinct(group) > 1) %>%
   distinct(val) %>%
   pull(val)
#[1] 1 4

Или, используя base R, мы можем просто table найти частоту и получить из нее идентификаторы

out <-  with(df1, colSums(table(rep(group, 2), unlist(df1[1:2])) > 0)) > 1
names(which(out))
#[1] "1" "4"

данные

df1 <- structure(list(from = c(1L, 2L, 3L, 4L, 6L, 8L), to = c(2L, 4L, 
 4L, 5L, 1L, 7L), group = c("metro", "metro", "metro", "train", 
 "train", "train")), class = "data.frame", row.names = c(NA, -6L
 ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...