如果 R 中 data.frame 的一列中存在两个指定值,如何保留一组的所有行

How to keep all rows of one group if two specified values are present in one column in data.frame in R

我在 R 中有一个数据框,如果存在两个或多个特定组,我想在其中删除特定组的所有行。在下面的示例中,如果 bil berry 和 blackberry 都存在,我想删除与 'bil berry' 相关的所有行。我已经到了可以确定我的数据是否包含两种或更多种浆果的地步,但我不确定接下来的步骤。我更喜欢 dplyr 的解决方案。

library(stringr)
library(dplyr)

data(fruit)

my.df <- data.frame(
"Name" = rep(fruit[1:7], each = 2), 
"Value" = 1:14
)

UniqueFruits <- unique(my.df$Name)
sum(grepl("berry", UniqueFruits))>1

像这样?

my.df %>%
mutate( berry = grepl("berry", Name)) %>%
filter( berry == F )

也许您正在尝试:

library(dplyr)

unique_berries <- grep('berry', my.df$Name, value = TRUE)
if(n_distinct(unique_berries) > 1) my.df <- my.df %>% filter(Name != 'bilberry')

my.df

#          Name Value
#1        apple     1
#2        apple     2
#3      apricot     3
#4      apricot     4
#5      avocado     5
#6      avocado     6
#7       banana     7
#8       banana     8
#9  bell pepper     9
#10 bell pepper    10
#11  blackberry    13
#12  blackberry    14

所以这是一种“纯”dplyr

library(stringr)
library(dplyr)
data(fruit)
my.df <- data.frame(
"Name" = rep(fruit[1:7], each = 2), 
"Value" = 1:14
)

my.df %>%
  mutate( keepMe = case_when(
    length (unique (grepl("berry", Name))) >0 & Name == "bilberry" ~ FALSE,
    TRUE ~ TRUE) 
  ) %>%
  filter( keepMe != F )

没有这样的 IF 语句。不确定我真的喜欢它!但它正是您所要求的 - 一个 tidyverse 解决方案