используйте dplyr, но в любом случае сохраняйте присутствие групп как минимум

#r #dplyr

#r #dplyr

Вопрос:

Привет, допустим, у меня есть df, такой как :

 Groups COL1 
G1 4
G1 32
G1 43
G2 43
G2 23
G2 0
G3 2
G3 4
G4 2
G4 1
  

и я хочу сохранить только группы, в которых у меня есть хотя бы одно значение COL1 >5

Для этого я использую :

 df %>%
  group_by(Groups) %>%
  filter(any(COL1 >5))
  

Здесь я должен получить :

 Groups COL1 
G1 4
G1 32
G1 43
G2 43
G2 23
G2 0
  

но давайте теперь скажем, что я хочу это сделать, но я хочу сохранить группы в определенном списке: list<-c(«G4»)

и если группа есть в этом списке, я все равно сохраняю эту группу (даже если все значения < 5), и я должен получить

 Groups COL1 
G1 4
G1 32
G1 43
G2 43
G2 23
G2 0
G4 5
G4 5
  

где я сохранил 4, потому что он был в списке

Комментарии:

1. Вы можете просто сделать df %>% group_by(Groups) %>% filter(any(COL1 > 5) | Groups %in% lst) .

2. а что, если у меня много filter(any()) строк?? Я должен добавлять это каждый раз?

3. Что означает «много filter(any()) строк»? Вы имеете в виду, что у вас есть больше столбцов ( COL2 , COL3 , …), которые необходимо передать filter() или у вас есть больше условий только для COL1 ? Лучше настроить ваш пример для расширенной задачи. Если вы считаете, что принятый вами ответ достаточно хорош, вы можете пропустить этот комментарий.

Ответ №1:

Попробуйте это решение, которое близко к тому, что вы хотите. Я повторно использовал ваш код и с помощью left_join() я добавил новую переменную Index , чтобы вы могли фильтровать для получения нужного вам фрейма данных. Вот код:

 library(tidyverse)
#List
listv<-c("G4")
#Code
df %>% left_join(df %>%
  group_by(Groups) %>%
  filter(any(COL1 >5) | Groups %in% listv) %>% mutate(Index=1) %>%
  filter(!duplicated(Groups)) %>% select(-COL1)) %>%
  filter(!is.na(Index)) %>% select(-Index)
  

Вывод:

   Groups COL1
1     G1    4
2     G1   32
3     G1   43
4     G2   43
5     G2   23
6     G2    0
7     G4    2
8     G4    1
  

Некоторые используемые данные:

 #Data
df <- structure(list(Groups = c("G1", "G1", "G1", "G2", "G2", "G2", 
"G3", "G3", "G4", "G4"), COL1 = c(4L, 32L, 43L, 43L, 23L, 0L, 
2L, 4L, 5L, 5L)), class = "data.frame", row.names = c(NA, -10L
))
  

Комментарии:

1. если я изменил таблицу ввода, G4 проходит только потому, что она присутствует в списке

2. @chippycentra Я обновил код для вас, чтобы он соответствовал списку значений, которые вы используете!