用于删除组内值的 R 代码

R Code for removing values within a group

我正在处理类似于以下数据的数据:

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

如果您能提供任何帮助,我们将不胜感激!

我们可以按操作进行分组,即按 'Letter' 分组,ifany 'ID' 有 4,只需根据该比较得到逻辑向量或 else return 一切 (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)

这是一个基本的 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

我们可以 subset ID = 4LetterID = 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])