Я изо всех сил пытаюсь написать правильную логику для фильтрации двух столбцов на основе только условия в одном столбце. У меня есть несколько идентификаторов, и если идентификатор появится в 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????
Ты можешь сделать:
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
Используйте дплир:
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 выполнит операцию для каждой подгруппы переменной, которую вы укажете как группировку. Следуй этим шагам:
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
Чем это отличается от этого ответа?
Я не замечал, что другие пишут ответ, пока сам не понял эту логику. По стечению обстоятельств наша логика такая же. Я попытался более подробно объяснить, как использовать код, и протестировал свои коды, чтобы убедиться, что это работает так, как задано в вопросе.
Простой базовый вариант 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
База R FTW! Лично мне немного легче читать, используя
with
(хотя символы не сохраняются):df4[with(df4, group %in% group[pop == 3]), ]
.