начальная загрузка по группам в тибле - PullRequest
0 голосов
/ 29 апреля 2018

Предположим, у меня есть тибль tbl_

tbl_ <- tibble(id = c(1,1,2,2,3,3), dta = 1:6)
tbl_
# A tibble: 6 x 2
     id   dta
  <dbl> <int>
1     1     1
2     1     2
3     2     3
4     2     4
5     3     5
6     3     6

Есть 3 группы идентификаторов. Я хочу пересмотреть целые группы идентификаторов 3 раза с заменой. Например, результирующий тибл может быть:

     id   dta
  <dbl> <int>
1     1     1
2     1     2
3     1     1
4     1     2
5     3     5
6     3     6

но не

     id   dta
  <dbl> <int>
1     1     1
2     1     2
3     1     1
4     2     4
5     3     5
6     3     6

или

     id   dta
  <dbl> <int>
1     1     1
2     1     1
3     2     3
4     2     4
5     3     5
6     3     6

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вот один вариант с sample_n и distinct

library(tidyverse)
distinct(tbl_, id) %>% 
    sample_n(nrow(.), replace = TRUE) %>% 
    pull(id) %>% 
    map_df( ~ tbl_ %>% 
         filter(id == .x)) %>%
    arrange(id)
# A tibble: 6 x 2
#     id   dta
#  <dbl> <int>
#1  1.00     1
#2  1.00     2
#3  1.00     1
#4  1.00     2
#5  3.00     5
#6  3.00     6
0 голосов
/ 29 апреля 2018

Можно получить номер строки minimum для каждого id. Этот номер строки будет использоваться для генерации случайных выборок из replace = TRUE.

library(dplyr)

tbl_ %>% mutate(rn = row_number()) %>%
  group_by(id) %>%
  summarise(minrow = min(rn)) ->min_row

indx <- rep(sample(min_row$minrow, nrow(min_row), replace = TRUE), each = 2) + 
        rep(c(0,1), 3)

tbl_[indx,]
# # A tibble: 6 x 2
#    id     dta
#   <dbl>  <int>
# 1  1.00     1
# 2  1.00     2
# 3  3.00     5
# 4  3.00     6
# 5  2.00     3
# 6  2.00     4

Примечание: В приведенном выше ответе число строк для каждого id было принято равным 2, но этот ответ может охватывать любое количество идентификаторов. Жестко закодированные each=2 и c(0,1) необходимо изменить, чтобы увеличить их, чтобы обрабатывать более 2 строк для каждого id

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