2016-08-18 5 views
0

У меня есть набор данных следующим образом:Как подмножество группы с dplyr

col1 col2 
1 26 
1 43  
1 34 
2 54 
2 27 
3 15 
4 1 
4 4 

Я хотел бы, чтобы выбрать только те группы, в которых col2 составляет более 25, так что в результате набор данные должны быть

col1 col2 
    1 26 
    1 43  
    1 34 
    2 54 
    2 27 

Это пример набор данные, а не реальная вещь так, а не простое подмножество ответа я действительно ищу dplyr ответ по линиям:

Nr<-Mrd %>% 
    group_by(col1) %>% 
    slice(which.min(col2>25)) 

однако этот ответ даст мне строки в каждой группе, которые составляют> 25, а не группы, которые имеют> 25 как минимум.

+4

Я не понимаю ваш желаемый выход. Ни в одной из ваших групп минимальное значение больше 25. Вы ищете * любое * значение больше 25? Что-то вроде 'Mrd%>% group_by (col1)%>% filter (any (col2> 25))'? Вам действительно нужно попытаться правильно объяснить себя. –

+1

Вы хотите сказать, что вы хотите сохранить 'col1', где есть хотя бы 1 значение> 25 в' col2'? (т. е. в базе r 'ind <- df $ col1 [df $ col2> 25]; df [df $ col1% in% ind,]' – Sotos

+0

Извинения. Я изменил данные, чтобы минимум в первых двух группах составляет более 25. Вопрос остается тем же, но я хочу получить группы, где минимум больше 25 –

ответ

3

После вашего поезда мысли, что вам не нужно which.min, но min и filter вместо slice

df %>% 
    group_by(col1) %>% 
    filter(min(col2) > 25) 

#Source: local data frame [5 x 2] 
#Groups: col1 [2] 

# col1 col2 
# <int> <int> 
#1  1 26 
#2  1 43 
#3  1 34 
#4  2 54 
#5  2 27 
2

Мы можем использовать data.table

library(data.table) 
setDT(df)[, if(min(col2) > 25) .SD, by = col1] 
# col1 col2 
#1: 1 26 
#2: 1 43 
#3: 1 34 
#4: 2 54 
#5: 2 27 

Или с помощью ave из base R

df[with(df, ave(col2>25, col1, FUN = all)),] 
# col1 col2 
#1 1 26 
#2 1 43 
#3 1 34 
#4 2 54 
#5 2 27 
Смежные вопросы