#r
Вопрос:
Я пытаюсь перекодировать значения с freq = 1 в следующую полосу.
Используя набор данных iris в качестве примера.
iris %>% select(Sepal.Length) %>% table %>% as.data.frame()
Из таблицы видно, что значения 7.9, 7.6, 7.4, 7.3, 7.1, 7, 5.3, 4.3 имеют частоты 1.
В настоящее время я вручную перекодирую отдельные частоты в следующую нижнюю полосу, а самую маленькую полосу-в верхнюю.
iris$Sepal.Length[iris$Sepal.Length == "7.9"] = "7.7"
iris$Sepal.Length[iris$Sepal.Length == "7.6"] = "7.4"
iris$Sepal.Length[iris$Sepal.Length == "7.3"] = "7.2"
iris$Sepal.Length[iris$Sepal.Length == "7.1"] = "7"
iris$Sepal.Length[iris$Sepal.Length == "5.3"] = "5.2"
iris$Sepal.Length[iris$Sepal.Length == "4.5"] = "4.4"
iris$Sepal.Length[iris$Sepal.Length == "4.3"] = "4.4"
Хотел бы получить ваш совет о том, как написать функцию, которая выполняет следующее:
- Проверьте каждое значение от наибольшего значения вниз для Freq = 1
- Когда определено значение с Freq = 1, измените его значение на следующее меньшее значение.
- Повторите проверку сверху.
- Если последнее значение (наименьшее значение) имеет Freq = 1, измените его значение на следующее более высокое значение.
- Завершите функцию, когда больше не будет Freq = 1.
Ответ №1:
Вы можете посчитать, отсортировать, задержать, а затем вручную исправить наименьшую полосу.
library(dplyr)
dat <- iris %>%
add_count(Sepal.Length) %>%
arrange(Sepal.Length) %>%
mutate(new_variable = if_else(n == 1, lag(Sepal.Length), Sepal.Length))
dat$new_variable[1] <- dat$new_variable[2]
head(dat)
#> Sepal.Length Sepal.Width Petal.Length Petal.Width Species n new_variable
#> 1 4.3 3.0 1.1 0.1 setosa 1 4.4
#> 2 4.4 2.9 1.4 0.2 setosa 3 4.4
#> 3 4.4 3.0 1.3 0.2 setosa 3 4.4
#> 4 4.4 3.2 1.3 0.2 setosa 3 4.4
#> 5 4.5 2.3 1.3 0.3 setosa 1 4.4
#> 6 4.6 3.1 1.5 0.2 setosa 4 4.6
Комментарии:
1. Привет, спасибо за ваш ответ. Это работает для моих нужд. Спасибо!
2. Отлично! Не стесняйтесь принять ответ, если он соответствует вашим потребностям.