R выбрать все строки в кадре данных, где значение дублируется в одном столбце, но имеет определенное значение в другом столбце - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь извлечь из моего фрейма данных R строки, которые имеют одинаковые значения в одном столбце, но в другом столбце есть либо 0, либо 1.

Например, если это фрейм данных:

Data <- data.frame(
+     X = c(1,3,5,7,7,8,9,10,10,11,11),
+     Y = sample(36476545:36476555),
+ timepoint = c(0,1,0,0,1,1,0,1,0,1,1)
+ )

, который выглядит как

> Data
    X        Y timepoint
1   1 36476549         0
2   3 36476545         1
3   5 36476552         0
4   7 36476547         0
5   7 36476546         1
6   8 36476548         1
7   9 36476551         0
8  10 36476555         1
9  10 36476553         0
10 11 36476554         1
11 11 36476550         1

Мой желаемый вывод - все строки, для которых значения дублируются в X с моментом времени = 0 для одного вхождения значения и 1 для другого вхождения, в результате чего

> Data
    X        Y timepoint
4   7 36476547         0
5   7 36476546         1
8  10 36476555         1
9  10 36476553         0

Обратите внимание, что последние два элемента данных, которые также дублируются в X, не учитываются, поскольку переменная момента времени равна 1 в обоих случаях.Существует решение в SQL , которое близко, но я не знаю, как его кодировать в R.

Решение Я попытался сначала создать информационный кадр для дубликатов, а затем попытаться получитьте, которые я хочу оттуда:

dupes <- Data[Data$X %in% 
Data$X[duplicated(Data$X)],]
ids <- Data$X[Data$timepoint==0]
Data[Data$X %in% ids,]

Но это вернуло строки, которые не имеют повторяющихся записей.Любая помощь будет оценена, спасибо!

1 Ответ

0 голосов
/ 08 февраля 2019

Это то, что вы искали?

library(dplyr)

Data <- data.frame(
     X = c(1,3,5,7,7,8,9,10,10,11,11),
     Y = sample(36476545:36476555),
 timepoint = c(0,1,0,0,1,1,0,1,0,1,1)
 )

Data %>% 
  group_by(X) %>% 
  filter(dplyr::n_distinct(timepoint) == 2)

n_distinct возвращает количество различных элементов в векторе.Из-за оператора group by возвращаются только строки с двумя разными временными точками на группу (X).

dplyr::n_distinct(c(1, 2, 1, 3, 1))

Data %>% 
  group_by(X) %>% 
  mutate(n_distinct = dplyr::n_distinct(timepoint))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...