Использование фильтра и выборки в сгруппированном кадре данных - PullRequest
0 голосов
/ 04 марта 2019

Я хотел бы получить два идентификатора, случайно выбранных из предварительно определенного набора идентификаторов.Однако использование sample с 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 Ответ

0 голосов
/ 04 марта 2019

Когда вы группируете, вы выполняете операцию для каждой группы.Таким образом, у вас не просто одна пара идентификаторов, например фиксированный ID% в% 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, а иногда все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...