一列中相同值的 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))
我是 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))