Повторная выборка групп строк на основе группирующей переменной в R

Я относительно новичок в R, поэтому прошу прощения, если это глупый/очевидный вопрос! Я заинтересован в создании нового набора данных, состоящего из коллекций строк, передискретизированных с заменой из большего набора данных.

Набор данных, который у меня есть, выглядит примерно так: несколько строк на группирующую переменную.

> df <- data.frame(value=c(1:5,1:4,1:3),ID=c(rep(1,5),rep(2,4),rep(3,3)))
> df
   value ID
1      1  1
2      2  1
3      3  1
4      4  1
5      5  1
6      1  2
7      2  2
8      3  2
9      4  2
10     1  3
11     2  3
12     3  3

Что я хотел бы сделать, так это создать новый набор данных, который подвергается повторной выборке (с заменой) на основе переменной группировки. Таким образом, набор данных с повторной выборкой может выглядеть примерно так:

   value ID
1      1  1
2      2  1
3      3  1
4      4  1
5      5  1
6      1  3
7      2  3
8      3  3
9      1  1
10     2  1
11     3  1
12     4  1
13     5  1

Спасибо за любые предложения!


person arrrrRgh    schedule 22.02.2016    source источник
comment
Вам нужно df[sample(nrow(df)), ] ?   -  person Ronak Shah    schedule 22.02.2016
comment
@RonakShah, спасибо за предложение. Мне нужно, чтобы он брал все строки при выборке данного идентификатора (т. Е. Выборка фрагментов строк).   -  person arrrrRgh    schedule 22.02.2016
comment
Если я правильно понял ваш вопрос, используя библиотеку dplyr и группировку, вы можете попробовать что-то вроде этого: df %>% group_by(ID) %>% slice(sample(n(), 3, replace = TRUE)). Это работает с фиксированным числом образцов. В противном случае вам нужно написать цикл с rbind.   -  person Gopala    schedule 22.02.2016
comment
Спасибо, @Гопала. Как и в примере, количество строк зависит от идентификатора группировки. Любые советы о том, как может выглядеть цикл с rbind?   -  person arrrrRgh    schedule 22.02.2016
comment
См. ниже... три различных решения для достижения желаемого результата.   -  person Gopala    schedule 23.02.2016


Ответы (1)


Для выборки разного количества строк на значение идентификатора вы можете попробовать что-то вроде этого (при условии, что значение идентификатора имеет небольшое количество уникальных значений):

result <- NULL
result <- rbind(result, df[sample(row.names(df[df$ID == 1, ]), 10, replace = TRUE), ])
result <- rbind(result, df[sample(row.names(df[df$ID == 2, ]), 5, replace = TRUE), ])
result <- rbind(result, df[sample(row.names(df[df$ID == 3, ]), 3, replace = TRUE), ])
row.names(result) <- seq(1:nrow(result))

Если имеется много значений идентификатора, вы можете использовать цикл с количеством выборок для каждого желаемого значения идентификатора. Например, если имеется шесть значений идентификатора и соответствующие количества выборок для каждого идентификатора равны 10, 5, 3, 7, 8 и 2, вы можете сделать что-то вроде этого:

nsamples <- c(10, 5, 3, 7, 8, 2)
result <- NULL
for (i in 1:length(nsamples)) {
  result <- rbind(result, df[sample(row.names(df[df$ID == i, ]), nsamples[i], replace = TRUE), ])
}
row.names(result) <- seq(1:nrow(result))

В любом случае вы получите такой вывод:

   value ID
1      1  1
2      4  1
3      1  1
4      4  1
5      2  1
6      3  1
7      1  1
8      1  1
9      4  1
10     2  1
11     2  2
12     3  2
13     1  2
14     3  2
15     1  2
16     3  3
17     2  3
18     1  3

Используя предложенное выше решение dplyr, вы также можете сделать что-то подобное для переменного количества выборок на значение идентификатора (это также требует предварительного указания количества выборок на соответствующий идентификатор в векторе):

library(dplyr)
nsamples <- c(10, 5, 3)
df %>% group_by(ID) %>% slice(sample(n(), nsamples[ID], replace = TRUE))
person Gopala    schedule 22.02.2016
comment
Это не делает того, о чем просили. Он выбирает случайное подмножество строк для данного идентификатора. Вопрос заключался в том, как выбирать идентификаторы с заменой, каждый раз беря все строки с этим идентификатором. - person ; 17.06.2016