一列中相同值的R子集行取决于另一列中的多个值

Posted

技术标签:

【中文标题】一列中相同值的R子集行取决于另一列中的多个值【英文标题】:R subset rows of same value in one column dependent on multiple values in another column 【发布时间】:2022-01-10 07:15:13 【问题描述】:

我是 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 和 filter。结果显示为空数据框:

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

【问题讨论】:

我只是对其进行了编辑以使表格可见,然后您未对其进行编辑。哈哈 【参考方案1】:
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  

【讨论】:

【参考方案2】:

试试这个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))

【讨论】:

以上是关于一列中相同值的R子集行取决于另一列中的多个值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 python 的另一列中的字符串值中从数据框中的一列中搜索字符串?

查找一列中具有相同值而另一列中具有其他值的行?

使用 R 根据另一列中的类别计算列和列表之间常见值的百分比

清除一张纸上一列中每一行的内容,取决于另一张纸上同一行中一列中的更改

在 SQL 中,我可以在另一列中获取与它们没有关联的特定值的列中的值吗?

根据另一列中的值更新 BigQuery 中的嵌套数组