Создайте два набора данных, равномерно разделив строки на основе почтовых индексов в R - PullRequest
0 голосов
/ 06 мая 2020

У меня есть набор данных с кодами клиентов, именами клиентов и почтовыми индексами. В наборе данных 149130 строк. Я хочу поровну разделить его на два набора данных (каждый из 74565 строк) и экспортировать в excel. Однако я хочу убедиться, что если есть два клиента для одного почтового индекса - один переходит в набор данных 1, а другой - в набор данных 2. Остальное может быть случайным отбором клиентов. Я новичок в r и пробовал различные коды поездов / тестов и образцов, однако мне не удалось достичь необходимого результата.

Подводя итог - я пытаюсь создать 2 случайных образца из фрейма данных но хотите убедиться, что если у вас более двух клиентов с определенным почтовым индексом - они должны быть поровну разделены между двумя образцами.

образец данных -

введите описание изображения здесь TIA

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Давайте сделаем некоторые воспроизводимые данные.

set.seed(2020)
zipcode <- sample.int(10000:99999, size = 149130, replace = TRUE)
zipcode <- stringr::str_pad(as.character(zipcode), width = 5, pad = "0")
custname <- sample(letters, size = 149130, replace = TRUE)
customers <- data.frame(zipcode = zipcode, custname = custname)
str(customers)
#> 'data.frame':    149130 obs. of  2 variables:
#>  $ zipcode : chr  "09628" "09452" "07767" "08920" ...
#>  $ custname: chr  "k" "y" "n" "a" ...

Тогда позвольте caret сделать всю тяжелую работу. Он добавляет столбец, который затем можно использовать для разделения одного фрейма данных на 2. Я head результаты, но человеческий осмотр показывает, что вы получили как можно ближе к 50/50

customers$whichsample <- caret::createFolds(factor(customers$zipcode), 
                                                   k = 2, 
                                                   list = FALSE )

head(table(customers$zipcode, customers$whichsample))
#>        
#>          1  2
#>   00001  8  7
#>   00002  4  5
#>   00003  8  7
#>   00004  7  6
#>   00005  7  8
#>   00006 11 11

Последующий запрос покажите, как разделить на два отдельных фрейма данных. Безопасный и медленный tidy метод, предполагающий, что вы хотите csample1 и csample2

csample1 <- customers %>% filter(whichsample == 1)
csample2 <- customers %>% filter(whichsample == 2)

Создано 06.05.2020 с помощью пакета (v0.3.0 )

0 голосов
/ 06 мая 2020

Мой общий подход:

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