Использование фильтра и выборки в сгруппированном фрейме данных

#r #dplyr

#r #dplyr

Вопрос:

Я хотел бы получить два идентификатора, выбранных случайным образом из предопределенного набора идентификаторов. Однако использование sample with dplyr::filter в сгруппированном фрейме данных возвращает неожиданные результаты «другого размера выборки», например, если я это делаю, sample(x,2) иногда я получаю 2, иногда я получаю число, не равное 2.

 df <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L, 4L, 
5L, 5L, 6L, 6L), Sub = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 
4L, 4L, 4L, 5L, 5L, 6L, 6L), .Label = c("a", "b", "c", "d", "f", 
"g"), class = "factor")), class = "data.frame", row.names = c(NA, 
-14L))

samp.vec <- c(1,2,3,4,5)

library(dplyr)
set.seed(123)
#Return Different sample size, Not working
df %>% group_by(ID)%>%filter(ID %in% sample(samp.vec,2)) %>% count(ID)
df %>% group_by(ID)%>%filter(ID %in% sample(samp.vec,2)) %>% count(ID)

set.seed(123)
#Return one sample size, Working
df %>% group_by(ID)%>% ungroup() %>% filter(ID %in% sample(samp.vec,2)) %>% count(ID)
df %>% group_by(ID)%>% ungroup() %>% filter(ID %in% sample(samp.vec,2)) %>% count(ID)
  

Одним из решений является использование ungroup() перед filter . Кто-нибудь знает, почему это происходит?

Комментарии:

1. Что вы пытаетесь сделать или получить?

2. Если вы делаете выборку из ВСЕХ ваших идентификаторов, то зачем группировать ее? Для меня это не имеет смысла. Как вы можете указать группе с помощью ID = 1 фильтровать, когда ID %in% c(2, 3) ??

3. @Sotos, мой R-код выглядит следующим образом df %>% group_by(ID) %>% #some calcautions #># filter() . Во-вторых, я уверен, что все samp.vec в IDS, так что это ID %in% sample(samp.vec,2) всегда допустимо.

4. @NelsonGon, учитывая продольный df «сгруппированный df». Я пытаюсь выбрать 2 идентификатора из определенного набора идентификаторов samp.vec , затем отфильтровать эти 2 идентификатора.

5. @A.Suliman, но вам нужно разгруппировать, потому что, если вы оставите его сгруппированным, тогда как вы сообщаете группе с ID = 1 отфильтровать идентификатор, если идентификатор c(2, 3) . В этом нет никакого смысла. Вы понимаете, о чем я говорю?

Ответ №1:

При группировании вы выполняете операцию для каждой группы. Таким образом, у вас есть не только одна пара идентификаторов, как фиксированный идентификатор %в% c(2, 3). Чтобы сделать это более понятным, давайте опустим filter и посмотрим результаты sample(samp.vec, 2) ,

 df %>% 
 group_by(ID) %>% 
 mutate(v1 =  toString(sample(samp.vec, 2)))

# A tibble: 14 x 3
# Groups:   ID [6]
#      ID Sub   v1   
#   <int> <fct> <chr>
# 1     1 a     2, 3 
# 2     1 a     2, 3 
# 3     1 a     2, 3 
# 4     2 b     1, 4 
# 5     2 b     1, 4 
# 6     3 c     3, 1 
# 7     3 c     3, 1 
# 8     4 d     4, 5 
# 9     4 d     4, 5 
#10     4 d     4, 5 
#11     5 f     4, 2 
#12     5 f     4, 2 
#13     6 g     2, 4 
#14     6 g     2, 4 
  

Таким образом, он будет фильтровать по 2 идентификатора из каждой группы. Таким образом, иногда у вас будет 2, иногда 3, а иногда и все из них.

Комментарии:

1. Отличный снимок. И последнее, в вашем примере мы получим одну группу, ID=4 например, в качестве фильтра в этой группе будет ID %in% c(4,5) . правильно?

2. На самом деле две группы ID=3 и ID=4