2016-06-15 2 views
3

Я хотел бы подмножить свой фрейм данных, чтобы сохранить только группы, у которых есть 3 или более наблюдения за РАЗНЫЕ дни. Я хочу избавиться от групп, которые имеют менее 3 наблюдений, или наблюдения, которые у них есть, не из трех разных дней.Удалите группы с менее чем тремя уникальными наблюдениями

Вот набор выборки данных:

Group Day 
1  1 
1  3 
1  5 
1  5 
2  2 
2  2 
2  4 
2  4 
3  1 
3  2 
3  3 
4  1 
4  5 

Таким образом, для приведенного выше примера, группы 1 и группы 3 будут сохранены и группы 2 и 4, будут удалены из кадра данных.

Надеюсь, это имеет смысл, я думаю, что решение будет довольно простым, но я не могу его решить (я совершенно новичок в R и не очень быстро придумываю решения для таких вещей). Я подумал, что, возможно, функция diff может пригодиться, но не стала намного больше, и мне не повезло найти существующие вопросы на SO и других сайтах для ответа.

спасибо, что заблаговременно!

+0

Попробуйте 'DF [DF $ Group% в% as.numeric (имена (которые (tap (df $ Day, df $ Group, function (x) length (unique (x))> = 3)))),] ' – nicola

ответ

6

С data.table вы могли бы сделать:

library(data.table) 
DT[, if(uniqueN(Day) >= 3) .SD, by = Group] 

, который дает:

Group Day 
1:  1 1 
2:  1 3 
3:  1 5 
4:  1 5 
5:  3 1 
6:  3 2 
7:  3 3 

Или с dplyr:

library(dplyr) 
DT %>% 
    group_by(Group) %>% 
    filter(n_distinct(Day) >= 3) 

, который дает тот же результат.

5

Одна идея использования dplyr

library(dplyr) 
df %>% 
    group_by(Group) %>% 
    filter(length(unique(Day)) >= 3) 

#Source: local data frame [7 x 2] 
#Groups: Group [2] 

# Group Day 
# (int) (int) 
#1  1  1 
#2  1  3 
#3  1  5 
#4  1  5 
#5  3  1 
#6  3  2 
#7  3  3 
+2

instea d 'length (уникальный (день))' вы могли бы вы 'n_distinct (день)' – theArun

+0

Nice one! Спасибо @Arun – Sotos

+0

'n_distinct (day)' уже был в моем ответе ...... – Jaap

4

Мы можем использовать base R

i1 <- rowSums(table(df1)!=0)>=3 
subset(df1, Group %in% names(i1)[i1]) 
# Group Day 
#1  1 1 
#2  1 3 
#3  1 5 
#4  1 5 
#9  3 1 
#10  3 2 
#11  3 3 

Или один вкладыш base R будет

df1[with(df1, as.logical(ave(Day, Group, FUN = function(x) length(unique(x)) >=3))),]