#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 Я обновил код для вас, чтобы он соответствовал списку значений, которые вы используете!