Как перекодировать значения в таблице на основе частоты значения

#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"
 

Хотел бы получить ваш совет о том, как написать функцию, которая выполняет следующее:

  1. Проверьте каждое значение от наибольшего значения вниз для Freq = 1
  2. Когда определено значение с Freq = 1, измените его значение на следующее меньшее значение.
  3. Повторите проверку сверху.
  4. Если последнее значение (наименьшее значение) имеет Freq = 1, измените его значение на следующее более высокое значение.
  5. Завершите функцию, когда больше не будет 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. Отлично! Не стесняйтесь принять ответ, если он соответствует вашим потребностям.