#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