如果 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 解决方案
我在 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 解决方案