R подмножество строк одного и того же значения в одном столбце зависит от нескольких значений в другом столбце

#r #dplyr #subset

#r #dplyr #подмножество

Вопрос:

Я новичок в R, и для этого может быть простое решение, но я изо всех сил пытаюсь его найти. Я хочу подмножество фрейма данных, чтобы исключить все строки, в которых нет обоих значений, предложенных в другой строке. Итак, предположим, что это мой фрейм данных: df1

v1 v2 v3
A 1 x
A 2 y
A 3 x
B 4 x
C 5 y
C 6 y
D 7 y
D 8 x

Я хочу исключить любые строки, которые НЕ имеют значения x и y (v3) для соответствующей буквы (v1), а также сохранить все остальные столбцы нетронутыми (v2), чтобы мой конечный результат был:

v1 v2 v3
A 1 x
A 2 y
A 3 x
D 7 y
D 8 x

Будут сохранены только значения A и D, поскольку они имеют как соответствующее значение x, так и соответствующее значение y. B и C будут исключены, так как у них есть только x ИЛИ y, но не оба.

Я пробовал использовать group_by и фильтр. Результат получается в виде пустого фрейма данных:

 library(dplyr) df2 lt;- df1 %gt;%   group_by(v1) %gt;%  filter(all(c('x', 'y') %in% v3))  

так же как:

 library(dplyr) df2 lt;- df1 %gt;%   group_by(v1) %gt;%   filter(any(v3 == "x"),  any(v3 == "y"))  

Комментарии:

1. Я просто отредактировал его, чтобы сделать таблицы видимыми, а затем вы его не редактировали. ха

Ответ №1:

 df1 %gt;%  group_by(v1) %gt;%  filter(all(unique(df1$v3) %in% v3))  # A tibble: 5 x 3 # Groups: v1 [2]  v1 v2 v3   lt;chrgt; lt;intgt; lt;chrgt; 1 A 1 x  2 A 2 y  3 A 3 x  4 D 7 y  5 D 8 x   

Ответ №2:

Попробуйте это aggregate решение

 df1[df1$v1 %in% names( which( table(   aggregate( . ~ v3   v1, df1, c )[,"v1"] ) gt; 1 )),]   v1 v2 v3 1 A 1 x 2 A 2 y 3 A 3 x 7 D 7 y 8 D 8 x  

Данные

 df1 lt;- structure(list(v1 = c("A", "A", "A", "B", "C", "C", "D", "D"),  v2 = 1:8, v3 = c("x", "y", "x", "x", "y", "y", "y", "x")), class = "data.frame", row.names = c(NA, -8L))