R用于删除组中值的代码



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

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"分组,ifany的"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)

我们可以subsetID = 4或所有其他值,其中LetterID = 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])

最新更新