Посмотрите таблицу на основе целочисленных значений - PullRequest
2 голосов
/ 03 февраля 2020

Рассмотрим следующий кадр данных:

lookup <- 
data.frame(
level = 1:5,
points_needed = c(150, 250, 420, 580, 620)
)

lookup

  level points_needed
1     1           150
2     2           250
3     3           420
4     4           580
5     5           620

Теперь рассмотрим следующие наблюдения:

data <-
data.frame(
person_name = c("Bob", "Bob", "Bob", "Jim", "Jim"),
match = c(1, 2, 3, 1, 2),
total_points = c(100, 300, 430, 200, 600)
)

data
  person_name match total_points
1         Bob     1          100
2         Bob     2          300
3         Bob     3          430
4         Jim     1          200
5         Jim     2          600

Я хотел бы создать новые столбцы в данных. В этом столбце указывается уровень person_name - он изменяется на основе total_points по отношению к таблице lookup. Желаемый результат:

data
  person_name match total_points level
1         Bob     1          100     0
2         Bob     2          300     2
3         Bob     3          430     3
4         Jim     1          200     1
5         Jim     2          600     5

Я не могу использовать соединение здесь, так как нечего присоединяться. Есть предложения?

1 Ответ

3 голосов
/ 03 февраля 2020

При этом используется findInterval, фактический уровень не требуется, поскольку он отсортирован и является непрерывным

data$level <- findInterval(data$total_points, lookup$points_needed)

> data
  person_name match total_points level
1         Bob     1          100     0
2         Bob     2          300     2
3         Bob     3          430     3
4         Jim     1          200     1
5         Jim     2          600     4

Незначительное примечание, что уровень для последней строки составляет 4

Добавление текстовой метки в таблицу поиска

lookup <- 
  data.frame(
    level = 1:5,
    points_needed = c(150, 250, 420, 580, 620),
    label = c("blue", "green", "yellow", "orange", "red")
  )

data$level <- findInterval(data$total_points, lookup$points_needed)
data$level2[data$level > 0] <- as.character(lookup$label[data$level])

> data
  person_name match total_points level level2
1         Bob     1          100     0   <NA>
2         Bob     2          300     2  green
3         Bob     3          430     3 yellow
4         Jim     1          200     1   blue
5         Jim     2          600     4 orange

Использование as.character не потребуется, если метки не были сохранены как факторы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...