我正在处理与以下数据类似的数据:
ID <- seq(1,10,1)
Letter <- c("A", "B", "C","C", "C", "D", "D", "E","F", "F")
df<- data.frame(ID, Letter)
ID Letter
1 1 A
2 2 B
3 3 C
4 4 C
5 5 C
6 6 D
7 7 D
8 8 E
9 9 F
10 10 F
具体来看Letter
列,我想对数据进行子集设置,使Letter
列只包括ID
值4。但我也想保留所有其他的价值观。所以数据看起来像:
ID Letter
1 1 A
2 2 B
4 4 C
6 6 D
7 7 D
8 8 E
9 9 F
10 10 F
如果您能提供任何帮助,我们将不胜感激!
这是一个基本的R选项
subset(df,ave(ID==4,Letter,FUN = function(x) Negate(any)(x)|x))
给出
ID Letter
1 1 A
2 2 B
4 4 C
6 6 D
7 7 D
8 8 E
9 9 F
10 10 F
我们可以通过操作进行分组,即按"Letter"分组,if
有any
的"ID"有4,只需根据该比较获得逻辑向量或else
返回所有(TRUE
(
library(dplyr)
df %>%
group_by(Letter) %>%
filter(if(any(ID == 4)) ID == 4 else TRUE)
# A tibble: 8 x 2
# Groups: Letter [6]
# ID Letter
# <dbl> <chr>
#1 1 A
#2 2 B
#3 4 C
#4 6 D
#5 7 D
#6 8 E
#7 9 F
#8 10 F
或者另一个不使用分组的选项是
df %>%
filter(Letter %in% setdiff(Letter, unique(Letter[ID == 4]))|ID == 4)
# ID Letter
#1 1 A
#2 2 B
#3 4 C
#4 6 D
#5 7 D
#6 8 E
#7 9 F
#8 10 F
及其在base R
中的实现
subset(df, Letter %in% setdiff(Letter, unique(Letter[ID == 4]))|ID == 4)
我们可以subset
ID = 4
或所有其他值,其中Letter
与ID = 4
中的值不同。
subset(df, ID == 4 | !Letter %in% Letter[ID == 4])
# ID Letter
#1 1 A
#2 2 B
#4 4 C
#6 6 D
#7 7 D
#8 8 E
#9 9 F
#10 10 F
这也可以在dplyr
中写成:
library(dplyr)
df %>% filter(ID == 4 | !Letter %in% Letter[ID == 4])