Как выбрать неуникальную комбинацию столбцов? - PullRequest
2 голосов
/ 01 апреля 2020

Мои данные выглядят так:

counts <- data.frame(
  pos = c(101, 101, 101, 102, 102, 102, 103, 103, 103, 101, 101, 101),
  chr = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4),
  subj = c("A", "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C")
)

pos должен принадлежать только одному уникальному chr, но здесь поз 101 относится к chr 1 и 4.

Я могу обнаружить этот случай как:

counts %>% select(pos, chr) %>%
  group_by(pos) %>%
  summarise(n_chrs = length(unique(chr))) %>%
  filter(n_chrs > 1)

Это возвращает pos, который имеет более чем chr значения:

 A tibble: 1 x 2
    pos n_chrs
  <dbl>  <int>
1   101      2

Что я хотел бы знать, какие chr значения подразумеваются, что-то вроде:

  pos chr
1 101   1
2 101   4

Спасибо!

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

Опция с использованием data.table

library(data.table) 
unique(setDT(counts), by = 'chr')[, .(chr = chr[.N > 1]), pos]
#   pos chr
#1: 101   1
#2: 101   4
2 голосов
/ 01 апреля 2020

Вы можете сделать:

library(dplyr)

counts %>%
  group_by(pos) %>%
  distinct(chr) %>%
  filter(n() > 1)

Вывод:

# A tibble: 2 x 2
# Groups:   pos [1]
    pos   chr
  <dbl> <dbl>
1   101     1
2   101     4
1 голос
/ 01 апреля 2020

Вместо summarize вы можете просто использовать mutate для создания группового счета. Это гарантирует, что вы сохраните chr, что вас интересует:

counts %>% select(pos, chr) %>%
  group_by(pos) %>%
  mutate(n_chrs = length(unique(chr))) %>%
  filter(n_chrs > 1) %>%
  unique()

Результат:

# A tibble: 2 x 3
# Groups:   pos [1]
    pos   chr n_chrs
  <dbl> <dbl>  <int>
1   101     1      2
2   101     4      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...