Изменить распределение полей в категориальной переменной по заданному распределению - PullRequest
0 голосов
/ 20 февраля 2019

Допустим, у нас есть data.frame, такой как приведенный ниже:

City
NYC
Boston
NYC
NYC
Providence 
Boston
NYC

Я хочу написать простейшую возможную функцию

redistribute <- function(data, column, unique_value, decrease_by) {
  #data = dataframe provided by user
  #column = column of the respective dataframe
  #unique_value = fields contained within the respective column of the respective dataframe
  #decrease_by = the desired "portion" or "distribution" of the unique_value within column. 
}

Редактировать:

Я перефразирую вопрос, так как он немного сбивает с толку.

  1. Мне нужно вычислить частоту (аргумент unique_value) в столбце. Например, это будет 4/7 или 0,57 для Нью-Йорка в столбце Сити.

  2. Уменьшите число вхождений unique_value, чтобы частота достиглаодин предоставлен пользователем в аргументе функции. Например, от 0,57 до (аргумент уменьшается_by) для Нью-Йорка.Например, от 0,57 до 0,10.

  3. Замените исходные поля, изначально занятые unique_value, другими значениями в столбце.Делайте это случайно. Например, мы удаляем первое вхождение поля 'NYC', чтобы уменьшить общую частоту уникального значения 'NYC' с 0,5 до 0,1, и заменяем его, например, на некоторый случайный город 'Бостон'.

Итак, ожидаемый результат будет:

City
NYC 
Boston
Boston
Providence
Boston
Providence
Boston

Я бы хотел избежать дюжины преобразований.Я ищу наиболее логичный / эффективный подход.

1 Ответ

0 голосов
/ 20 февраля 2019

То, что вы, по-моему, пытаетесь сделать, - это просто соединить несколько вещей в функцию.Используя ваш пример, давайте предположим, что new_level - это процент от того фактора, который вы хотите получить в новых данных.

city = c("NYC", "Boston", "NYC", "NYC", "Providence", "Boston", "NYC")
data = data.frame(city=city)

redistribute <- function(data, column, unique_value, new_level){
        ## Names of factors and size of data
        fac_names <- levels(factor(data[,column]))
        size <- nrow(data)

        ## Make new list using rep and sample with desired ratio
        new_col <- c(rep(unique_value,
                        floor(new_level*size)),
                        sample(fac_names[which(fac_names!=unique_value)],
                               size=(size-floor(new_level*size)),
                               replace=TRUE))

        ## Mix up and assign to data frame
        data[,column] <- sample(new_col)
        return(data)
}

redistribute(data, column="city",
                unique_value="NYC",
                new_level=0.3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...