一列中相同值的 R 子集行依赖于另一列中的多个值

R subset rows of same value in one column dependent on multiple values in another column

我是 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

我希望消除任何不具有相应字母 (v1) 的 x 和 y 值 (v3) 的行,同时保持所有其他列不变 (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 <- df1 %>% 
     group_by(v1) %>%
     filter(all(c('x', 'y') %in% v3))

以及:

library(dplyr)
df2 <- df1 %>% 
   group_by(v1) %>% 
   filter(any(v3 == "x"),
          any(v3 == "y"))
df1 %>%
   group_by(v1) %>%
   filter(all(unique(df1$v3) %in% v3))

# A tibble: 5 x 3
# Groups:   v1 [2]
  v1       v2 v3   
  <chr> <int> <chr>
1 A         1 x    
2 A         2 y    
3 A         3 x    
4 D         7 y    
5 D         8 x  

试试这个aggregate解决方案

df1[df1$v1 %in% names( which( table( 
  aggregate( . ~ v3 + v1, df1, c )[,"v1"] ) > 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 <- 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))