Ошибка - замена имеет [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/