#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))