Логика фильтрации по двум столбцам

Я изо всех сил пытаюсь написать правильную логику для фильтрации двух столбцов на основе только условия в одном столбце. У меня есть несколько идентификаторов, и если идентификатор появится в 2020 году, я хочу, чтобы все данные за другие годы, в которые был измерен идентификатор, пришли.

Например, если группа содержит число 3, мне нужны все значения в этой группе. Мы должны получить фрейм данных со всеми строками b и d.

df4 <- data.frame(group = c("a", "a", "a", "a", "a", "b", "b", "b", "b", "b", 
                        "c", "c", "c", "c", "c", "d", "d", "d", "d", "d"),
                  pop = c(1, 2, 2, 4, 5, 1, 2, 3, 4, 5, 1, 2, 1, 4, 5, 1, 2, 3, 4, 5),
                  value  = c(1,2,3,2.5,2,2,3,4,3.5,3,3,2,1,2,2.5,0.5,1.5,6,2,1.5)) 

threes <- df4 %>%
   filter(pop == 3 |&ifelse????
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
363
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ты можешь сделать:

df4[df4$group %in% df4$group[df4$pop == 3],]
#>    group pop value
#> 6      b   1   2.0
#> 7      b   2   3.0
#> 8      b   3   4.0
#> 9      b   4   3.5
#> 10     b   5   3.0
#> 16     d   1   0.5
#> 17     d   2   1.5
#> 18     d   3   6.0
#> 19     d   4   2.0
#> 20     d   5   1.5

База R FTW! Лично мне немного легче читать, используя with (хотя символы не сохраняются): df4[with(df4, group %in% group[pop == 3]), ].

A5C1D2H2I1M1N2O1R2T1 15.12.2020 01:46

Используйте дплир:

df4%>%group_by(group)%>%filter(any(pop==3))
Ответ принят как подходящий

Немного медленнее, чем другие ответы здесь (больше шагов), но для меня немного понятнее:

df4 %>% 
  filter(pop == 3) %>% 
  distinct(group) %>% 
  pull(group) -> groups

df4 %>% 
  filter(group %in% groups)

или если вы хотите объединить два шага:

df4 %>% 
  filter(group %in% df4 %>% 
           filter(pop == 3) %>% 
           distinct(group) %>% 
           pull(group))

Вы можете сделать это, используя объединенные функции dplyr group_by(), filter() и any(). any() вернет TRUE для условия соответствия. Group by выполнит операцию для каждой подгруппы переменной, которую вы укажете как группировку. Следуй этим шагам:

  1. Сначала передайте данные в group_by() для группировки по групповой переменной.
  2. Затем направьте фильтр(), чтобы отфильтровать, если какая-либо групповая поп-группа равна 3, используя функцию any().
df4 <- data.frame(group = c("a", "a", "a", "a", "a", "b", "b", "b", "b", "b", 
                            "c", "c", "c", "c", "c", "d", "d", "d", "d", "d"),
                  pop = c(1, 2, 2, 4, 5, 1, 2, 3, 4, 5, 1, 2, 1, 4, 5, 1, 2, 3, 4, 5),
                  value  = c(1,2,3,2.5,2,2,3,4,3.5,3,3,2,1,2,2.5,0.5,1.5,6,2,1.5)) 
# load the library
library(dplyr)

threes <- df4 %>% 
group_by(group) %>%  
filter(any(pop == 3))
# print the result
threes   
          

Выход:

threes
# A tibble: 10 x 3
# Groups:   group [2]
   group   pop value
   <chr> <dbl> <dbl>
 1 b         1   2  
 2 b         2   3  
 3 b         3   4  
 4 b         4   3.5
 5 b         5   3  
 6 d         1   0.5
 7 d         2   1.5
 8 d         3   6  
 9 d         4   2  
10 d         5   1.5

Чем это отличается от этого ответа?

A5C1D2H2I1M1N2O1R2T1 15.12.2020 01:37

Я не замечал, что другие пишут ответ, пока сам не понял эту логику. По стечению обстоятельств наша логика такая же. Я попытался более подробно объяснить, как использовать код, и протестировал свои коды, чтобы убедиться, что это работает так, как задано в вопросе.

ranamahmud 15.12.2020 01:44

Простой базовый вариант R использует subset + ave

subset(
  df4,
  ave(pop == 3, group, FUN = any)
)

который дает

   group pop value
6      b   1   2.0
7      b   2   3.0
8      b   3   4.0
9      b   4   3.5
10     b   5   3.0
16     d   1   0.5
17     d   2   1.5
18     d   3   6.0
19     d   4   2.0

Другие вопросы по теме