Ошибка - замена имеет [x] строки, данные имеют [y]

У меня есть числовой столбец ( "значение" ) в dataframe ( "df" ), и я хотел бы создать новый столбец ( "valueBin" ) на основе "value". У меня есть следующий условный код для определения df $valueBin:

df$valueBin[which(df$value<=250)] <- "<=250"
df$valueBin[which(df$value>250 & df$value<=500)] <- "250-500"
df$valueBin[which(df$value>500 & df$value<=1000)] <- "500-1,000"
df$valueBin[which(df$value>1000 & df$value<=2000)] <- "1,000 - 2,000"
df$valueBin[which(df$value>2000)] <- ">2,000"

Я получаю следующую ошибку:

"Ошибка в $<-.data.frame (*tmp*," valueBin ", value = c (NA, NA, NA,:   замена имеет 6530 строк, данные имеют 6532"

Каждый элемент df$value должен вписываться в один из моих операторов which(). В df$value отсутствуют пропущенные значения. Хотя даже если я запускаю только первый условный оператор (< = 250), я получаю ту же самую ошибку с "...replacement has 6530 rows...", хотя существует путь меньше, чем 6530 записей со значением <= 250, а значение никогда не является NA.

Эта ссылка SO отмечает аналогичную ошибку, когда использование aggregate() было ошибкой, но рекомендуется установить версию R, которая у меня есть. Кроме того, в отчете об ошибке говорится, что он исправлен. Совокупная ошибка R: " замена имеет <foo> строки, данные имеют <bar>

Эта ссылка SO больше связана с моей проблемой, и проблема здесь была связана с его/ее условной логикой, которая вызывала меньшее количество элементов заменяемого массива. Я предполагаю, что это тоже должна быть моя проблема, и сначала я понял, что должен быть "< =" вместо "<" или наоборот, но после проверки я уверен, что все они правильны, чтобы покрыть каждое значение "значение" без перекрытий. Ошибка R в '[< -. data.frame'... замена имеет # элемента, требуется #

Ответы

Ответ 1

Вы можете использовать cut

 df$valueBin <- cut(df$value, c(-Inf, 250, 500, 1000, 2000, Inf), 
    labels=c('<=250', '250-500', '500-1,000', '1,000-2,000', '>2,000'))

данные

 set.seed(24)
 df <- data.frame(value= sample(0:2500, 100, replace=TRUE))

Ответ 2

Ответ @akrun, конечно же, делает трюк. Для будущих гуглеров, которые хотят понять, почему, вот объяснение...

Сначала необходимо создать новую переменную.

Переменная "valueBin" должна быть уже в df, чтобы условное присвоение работало. По сути, синтаксис кода правильный. Просто добавьте одну строку перед патроном для создания этого имени -

df$newVariableName <- NA

Затем вы продолжаете все правила условного присваивания, например

df$newVariableName[which(df$oldVariableName<=250)] <- "<=250"

Я обвиняю того, кто написал это сообщение об ошибке пакета... Отладка была особенно запутана этим сообщением об ошибке. Не имеет значения, что у вас есть два массива в df с разной длиной. Нет. Просто создайте новый столбец первым. Для получения дополнительной информации проконсультируйтесь с этим сообщением https://www.r-bloggers.com/translating-weird-r-errors/