Динамическое создание бинов в фрейме данных с помощью разрывов и квантилей не удается?

РЕДАКТИРОВАТЬ: я допустил ошибку в своем предыдущем коде, которым я поделился. Я заменил "бины" на "б", но пропустил один...

Теперь я также использую правильный data.frame (y вместо оригинального df.score)

НОВЫЙ код:

# some data
x <- runif(1000)
x2 <- rnorm(1000)
y <- data.frame(x,x2)
# we want to bin the dataframe y acording to values in x into b bins
b = 10
bins=10

# we create breaks in several ways
breaks=unique(quantile(x, probs=seq.int(0,1, by=1/b)))
breaks=unique(quantile(y$x, probs=seq.int(0,1, length.out=b+1)))

# now to the question
# this wokrs
y$b <- with(y, cut(x, breaks=unique(quantile(x, probs=seq.int(0,1, length.out=11))), include.lowest=TRUE))
table(y$b)
# this works too
y$b2 <- with(y, cut(x, breaks=unique(quantile(x, probs=seq.int(0,1, length.out=(bins+1)))), include.lowest=TRUE))
table(y$b2)
# this does not work
y$b3 <- with(y, cut(x, breaks=unique(quantile(x, probs=seq.int(0,1, length.out=(b+1)))), include.lowest=TRUE))

Ошибка в seq.int(0, 1, length.out = (b + 1)) : 'length.out' должно быть неотрицательным числом. Кроме того: Предупреждающее сообщение: В Ops.factor(b, 1): + не имеет значения для факторов

Теперь, если я разделю код, проблем не будет!!!

brks=unique(quantile(x, probs=seq.int(0,1, length.out=(b + 1))))
y$b3 <- with(y, cut(x, breaks=brks, include.lowest=TRUE))

Я потерялся здесь...

Это часть более динамичного кода, связанного вместе на основе деталей в наборе данных.

Поэтому я хочу создавать корзины на лету и сообщать о них. Теперь код работает, но я не понимаю, почему, когда я использую слово «bins», код работает, а при использовании «b» он терпит неудачу...?


СТАРЫЙ отсюда мне нужно динамически добавлять бины в фреймворк данных, чтобы я мог сообщить о них позже.

# some data
x <- runif(1000)
x2 <- rnorm(1000)
y <- data.frame(x,x2)
# we want to bin the dataframe y acording to values in x into b bins
b = 10

# we create breaks in several ways
breaks=unique(quantile(x, probs=seq.int(0,1, by=1/b)))
breaks=unique(quantile(y$x, probs=seq.int(0,1, length.out=b+1)))

# now to question
# this works

y$bins <- with(df.score, cut(x, breaks=unique(quantile(Pchurn, probs=seq.int(0,1, length.out=11))), include.lowest=TRUE))
table(y$bins)

Поэтому, если я хочу сделать то же самое, используя bin var напрямую, это не удастся:

# this does not work
y$bins <- with(df.score, cut(x, breaks=unique(quantile(Pchurn, probs=seq.int(0,1, length.out=bins+1))), include.lowest=TRUE))


Error in seq.int(0, 1, length.out = (bins + 1)) : 
  'length.out' must be a non-negative number
In addition: Warning message:
In Ops.factor(bins, 1) : + not meaningful for factors

Что мне здесь не хватает?


person Hugo Koopmans    schedule 27.09.2013    source источник
comment
Пример не воспроизводим.   -  person Ari B. Friedman    schedule 27.09.2013
comment
У вас есть столбец bins в вашем df.score? ИМХО, вы хотите использовать length.out=b+1 вместо length.out=bins+1.   -  person sgibb    schedule 27.09.2013


Ответы (1)


Я думаю, вы хотите этого (заменив b на bins в параметре длины calc чуть ниже «#это не работает»):

y$bins <- with(df.score, cut(x, 
                    breaks=unique(quantile(Pchurn, 
                                         probs=seq.int(0,1, length.out=b+1))), 
                    include.lowest=TRUE))

Тяжело тестировать без переменной score и более полного описания целей, но хотя бы код не выдает ошибку с этим в workspace.

 df.score=data.frame(Pchurn=rnorm(100), x=rnorm(100))
person IRTFM    schedule 27.09.2013
comment
Привет, спасибо за ответы, я вижу, что в моем примере была ошибка. Я не заменил все контейнеры на b, и это, похоже, решило проблему. Странно, что слово «бины», похоже, означает что-то другое, чем номер, который я ему присвоил? - person Hugo Koopmans; 28.09.2013
comment
У вас не было объекта с именем «bins», когда я рассматривал вопрос ранее. Вы, вероятно, запутываетесь, имея имена столбцов, которые используются в качестве имен объектов. Это вызовет путаницу, аналогичную проблемам с использованием функции attach. - person IRTFM; 28.09.2013
comment
Я прав, я запутался, но теперь я перезапустил сеанс R, очистил рабочее пространство, но все же вышеизложенное выдает ошибку. Только на примере b3... - person Hugo Koopmans; 28.09.2013
comment
Верно. Теперь у вас есть столбец с именем «b» и объект с именем «b», и поскольку вы используете with(y, ...), интерпретатор R находит векторное значение для параметра length.out до того, как он найдет объект length-1 в рабочей области, и выдает ошибку. . ПЕРЕСТАНЬТЕ ИСПОЛЬЗОВАТЬ ОДИНАКОВЫЕ ИМЕНА ДЛЯ ОБЪЕКТОВ И КОЛОНН! - person IRTFM; 29.09.2013